最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java教程各種接口的介紹

 更新時(shí)間:2013年02月18日 17:12:13   投稿:shangke  
Java教程各種接口的介紹,需要的朋友可以參考一下

Interfaces 接口
在軟件工程中,由一份“契約”規(guī)定來自不同的開發(fā)小組的軟件之間如何相互作用是非常常見的。每個(gè)小組都可以在不知道別的組的代碼的前提下開發(fā)自己的代碼。Java中的interface就是這樣的一份“契約”。
舉個(gè)例子,假設(shè)在未來社會有一種智能汽車,它可以在自動運(yùn)載旅客而不需要人工操作。汽車生產(chǎn)商開發(fā)了軟件(當(dāng)然是用Java)來控制這種汽車停止,發(fā)動,加速,左轉(zhuǎn)等等。電子導(dǎo)航儀器生產(chǎn)商負(fù)責(zé)開發(fā)接受GPS位置數(shù)據(jù)和交通狀況無線傳輸?shù)碾娔X系統(tǒng),并且應(yīng)用這些信息來駕駛汽車。
汽車生產(chǎn)商必須公布工業(yè)標(biāo)準(zhǔn)interface,該interface需詳細(xì)解釋哪些methods可以用于控制汽車運(yùn)動(該標(biāo)準(zhǔn)適用于任何汽車,任何生產(chǎn)商)。導(dǎo)航系統(tǒng)生產(chǎn)商就可以應(yīng)用這個(gè)interface所介紹的各種methods來控制汽車。任何一個(gè)工業(yè)廠商都不需了解其他廠商是如何實(shí)現(xiàn)他們的軟件的。事實(shí)上,只要大家都嚴(yán)格遵守所公布的interface,每個(gè)廠商對其自己的軟件都有高度所有權(quán),并且保有隨時(shí)修改的權(quán)利。
在java中的interface
在java編程語言里,一個(gè)interface是引用類型(reference),它與class相似,因此只能包含常量(constants),方法簽名(method signatures)和嵌套類型(nested types)。Interface不得含有方法的具體代碼(method body)。 Interface 不可被實(shí)例化(instantiated),只能被其它c(diǎn)lass實(shí)現(xiàn)(implemented)或者被其它interface繼承。
定義一個(gè)interface與創(chuàng)建一個(gè)新類類似:

復(fù)制代碼 代碼如下:

public interface OperateCar { 
// constant declarations, if any 
// method signatures 
// An enum with values RIGHT, LEFT 
   int turn(Direction direction, 
            double radius, 
            double startSpeed, 
            double endSpeed); 
   int changeLanes(Direction direction, 
                   double startSpeed, 
                   double endSpeed); 
   int signalTurn(Direction direction, 
                  boolean signalOn); 
   int getRadarFront(double distanceToCar, 
                     double speedOfCar); 
   int getRadarRear(double distanceToCar, 
                    double speedOfCar); 
         …… 
   // more method signatures 
}

如想使用上面這個(gè)interface,你需要寫一個(gè)class來實(shí)現(xiàn)它。當(dāng)一個(gè)可被實(shí)例化的class實(shí)現(xiàn)某個(gè)接口時(shí),它需要提供所有該interface所聲明的所有方法(methods)的具體代碼。
在上面的自動化汽車的例子中,汽車生產(chǎn)商即是接口實(shí)現(xiàn)者。由雪佛蘭公司的實(shí)現(xiàn)方法當(dāng)然不同于公司的方法,但是它們都遵循同一個(gè)接口。 導(dǎo)航系統(tǒng)生產(chǎn)商是這個(gè)接口的使用者,他們的系統(tǒng)將根據(jù)汽車方位的GPS數(shù)據(jù),數(shù)字化地圖和交通情況來駕駛汽車。因此,這個(gè)導(dǎo)航系統(tǒng)將會涉及以下的方法(methods): 轉(zhuǎn)彎,切道,剎車,加速等等。
API 接口
自動化汽車的例子展示了interface在工業(yè)標(biāo)準(zhǔn)應(yīng)用程序接口(API, Application Programming Interface)中的應(yīng)用. 在商業(yè)軟件中,API也很常見。 通常來說, 一個(gè)公司發(fā)售的軟件包中會含有其他公司希望應(yīng)用在自己的產(chǎn)品中的復(fù)雜方法(methods)。比如一個(gè)包含了數(shù)字圖形處理方法的軟件包就可以給開發(fā)終端客戶圖像軟件的公司。購買后,該公司就可以應(yīng)用interface所定義的方法。當(dāng)圖像處理公司向所有客戶公開它的API的同時(shí),這些API的實(shí)現(xiàn)方法是高度保密的。事實(shí)上,只要保留住原始的interface不被改變,這些API的實(shí)現(xiàn)方法很可能在將來被重寫。
Interfaces 和多重繼承
在java編程語言里,interface還有另外一個(gè)重要作用。 盡管Interface是與類一起使用的,但它并不是類的層次結(jié)構(gòu)的一部分。java編程語言不支持多重繼承,但是interface提供了替代方案。
在java中,一個(gè)類只能繼承于單一的類,但是它可以實(shí)現(xiàn)多個(gè)接口。因此,對象可以有多重類型:屬于它自身類的類型,和屬于它所繼承的所有接口的類型。這意味著,如果聲明一個(gè)變量是某個(gè)接口類型,這個(gè)變量可以指代任何實(shí)現(xiàn)該接口的類的實(shí)例。這部分會在“使用接口類型”中詳細(xì)討論。
定義一個(gè)interface
一個(gè)接口的定義是由 修飾詞(modifiers),關(guān)鍵詞 interface, 接口名稱,由逗號分隔開的父接口(parent interfaces),和接口實(shí)體(interface body)。
例子如下:
復(fù)制代碼 代碼如下:

public interface GroupedInterface extends Interface1, Interface2, Interface3 { 
// constant declarations 
// base of natural logarithms 
    double E = 2.718282; 
// method signatures  
    void doSomething (int i, double x); 
    int doSomethingElse(String s); 
}

Public規(guī)定了這個(gè)接口可以被任何包中的任何類所使用。如果你聲明這個(gè)接口是public的,它只能被同一個(gè)包里的類所使用。
一個(gè)接口可以繼承其它接口,就像一個(gè)類能后繼承其它類一樣。但是類只能繼承一個(gè)父類,而接口卻可以繼承任何數(shù)目的接口。
接口實(shí)體(interface body)
接口實(shí)體中含有它所包含的所有方法的聲明。每個(gè)聲明都以引號為結(jié)束,因?yàn)榻涌诓挥脤?shí)現(xiàn)它所聲明的方法。接口中所有的方法都默認(rèn)是public的,因此修飾詞public可以被省略。
接口還可以聲明常量。同樣的,常量的修飾詞public, static和final可以被省略。
接口的實(shí)現(xiàn)
為了聲明某個(gè)類實(shí)現(xiàn)了某個(gè)接口,你需要在類的聲明中使用implements。你的類可以實(shí)現(xiàn)多個(gè)接口,所以implements關(guān)鍵詞后面可以跟隨多個(gè)由逗號分隔的接口名稱。為了方便,implements關(guān)鍵詞多跟在extends關(guān)鍵詞的后面。
一個(gè)接口實(shí)例—Relatable
Relatable是一個(gè)用來比較兩個(gè)對象大小的接口。
復(fù)制代碼 代碼如下:

public interface Relatable { 
    // this (object calling isLargerThan) 
    // and other must be instances of  
    // the same class returns 1, 0, -1  
    // if this is greater // than, equal  
    // to, or less than other 
    public int isLargerThan(Relatable other); 
}

如果你想比較兩個(gè)相似的對象的大小,不管該對象屬于什么類,這個(gè)類需要實(shí)現(xiàn)Relatable接口。
只要有辦法可以比較對象的相對大小,任何類都可以實(shí)現(xiàn)Relatable接口。對字符串來說,可以比較字符數(shù);對書來說,可以比較頁數(shù);對學(xué)生來說,可以比較體重。對平面幾何對象來說,比較面積是很好的選擇;對三維對象來說,就需要比較體積了。所有以上的類都能實(shí)現(xiàn)int isLargerThan()方法。
如果你知道某個(gè)類實(shí)現(xiàn)了Relatable接口,你可以比較從這個(gè)類實(shí)例化的對象了。
Relatable接口的實(shí)現(xiàn)
下面是一個(gè)三角形類,它實(shí)現(xiàn)了Relatable接口。
復(fù)制代碼 代碼如下:

public class RectanglePlus 
    implements Relatable { 
    public int width = 0; 
    public int height = 0; 
    public Point origin; 
    // four constructors 
    public RectanglePlus() { 
        origin = new Point(0, 0); 
    } 
    public RectanglePlus(Point p) { 
        origin = p; 
    } 
    public RectanglePlus(int w, int h) { 
        origin = new Point(0, 0); 
        width = w; 
        height = h; 
    } 
    public RectanglePlus(Point p, int w, int h) { 
        origin = p; 
        width = w; 
        height = h; 
    } 
    // a method for moving the rectangle 
    public void move(int x, int y) { 
        origin.x = x; 
        origin.y = y; 
    } 
    // a method for computing 
    // the area of the rectangle 
    public int getArea() { 
        return width * height; 
    } 
    // a method required to implement 
    // the Relatable interface 
    public int isLargerThan(Relatable other) { 
        RectanglePlus otherRect  
            = (RectanglePlus)other; 
        if (this.getArea() < otherRect.getArea()) 
            return -1; 
        else if (this.getArea() > otherRect.getArea()) 
            return 1; 
        else
            return 0; 
    } 
}

使用接口類型
在你定義一個(gè)新的接口時(shí),你其實(shí)在定義一個(gè)新的引用類型。在你能使用數(shù)據(jù)類型名稱的地方,都可以使用接口名稱。如果你定義了一個(gè)類型為接口的引用變量,該變量能指向的對象所在的類必須實(shí)現(xiàn)了該接口。
下例是一個(gè)在一對對象中返回較大對象的方法:
復(fù)制代碼 代碼如下:

public Object findLargest(Object object1, Object object2) { 
   Relatable obj1 = (Relatable)object1; 
   Relatable obj2 = (Relatable)object2; 
   if ((obj1).isLargerThan(obj2) > 0) 
      return object1; 
   else
      return object2; 
}

通過把數(shù)據(jù)類型object1轉(zhuǎn)換成Relatable,對象obj1可以調(diào)用isLargerThan方法。
同理,只要是實(shí)現(xiàn)了Relatable的類,也可以使用下面的方法。
復(fù)制代碼 代碼如下:

public Object findSmallest(Object object1, Object object2) { 
   Relatable obj1 = (Relatable)object1; 
   Relatable obj2 = (Relatable)object2; 
   if ((obj1).isLargerThan(obj2) < 0) 
      return object1; 
   else
      return object2; 

public boolean isEqual(Object object1, Object object2) { 
   Relatable obj1 = (Relatable)object1; 
   Relatable obj2 = (Relatable)object2; 
   if ( (obj1).isLargerThan(obj2) == 0) 
      return true; 
   else
      return false; 
}

這些方法適用于任何“Relatable”的類,而無關(guān)它們的繼承關(guān)系。實(shí)現(xiàn)了Relatable的類,它們既屬于自身(或者父類)的類型,也屬于Relatable類型。這使得它們具有了多重繼承的優(yōu)點(diǎn),因?yàn)樗鼈兛梢酝瑫r(shí)具備父類和接口的行為。
重寫接口
假設(shè)你開發(fā)了一個(gè)接口名為DoIt:
復(fù)制代碼 代碼如下:

public interface DoIt { 
   void doSomething(int i, double x); 
   int doSomethingElse(String s); 
}

然后,你想加入一個(gè)新的方法在這個(gè)接口里,因此代碼變成:
復(fù)制代碼 代碼如下:

public interface DoIt { 
   void doSomething(int i, double x); 
   int doSomethingElse(String s); 
   boolean didItWork(int i, double x, String s); 
}

你需要預(yù)估你的接口用戶的需求,并從開始就完善的設(shè)計(jì)好這個(gè)接口。但是這常常是無法做到的。另一個(gè)解決方法就是再寫一個(gè)接口。例如,你可以寫一個(gè)DoItPlus的接口繼承原有的接口。

復(fù)制代碼 代碼如下:

public interface DoItPlus extends DoIt { 
   boolean didItWork(int i, double x, String s); 
}

現(xiàn)在你的用戶可以選擇繼續(xù)使用舊接口DoIt,或是升級的新接口DoItPlus。
總結(jié)
接口就是兩個(gè)對象間的溝通協(xié)議。
一個(gè)接口的聲明包含一些方法的簽名(signatures),但不需要實(shí)現(xiàn)它們;也可能含有一些常量。
實(shí)現(xiàn)某接口的類必須實(shí)現(xiàn)該接口所聲明的所有的方法。
在任何使用類型名稱的地方都可以使用接口的名字。
英文原文;Oracle,編譯:@philhu

幾招防范Java漏洞
Java異常處理
經(jīng)過糟糕一年后,Java正沿著正確方向發(fā)展
Java枚舉的七種常見用法
選擇Java還是.NET

相關(guān)文章

  • java實(shí)戰(zhàn)之猜字小游戲

    java實(shí)戰(zhàn)之猜字小游戲

    這篇文章主要介紹了java實(shí)戰(zhàn)之猜字小游戲,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助呦,需要的朋友可以參考下
    2021-04-04
  • Java使用opencv識別二維碼的完整步驟

    Java使用opencv識別二維碼的完整步驟

    OpenMV是一個(gè)開源,低成本,功能強(qiáng)大的機(jī)器視覺模塊,下面這篇文章主要給大家介紹了關(guān)于Java使用opencv識別二維碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • SpringBoot中使用@ControllerAdvice注解詳解

    SpringBoot中使用@ControllerAdvice注解詳解

    這篇文章主要介紹了SpringBoot中使用@ControllerAdvice注解詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個(gè)Controller增強(qiáng)器,可對controller中被 @RequestMapping注解的方法加一些邏輯處理,需要的朋友可以參考下
    2023-10-10
  • springboot @ConfigurationProperties和@PropertySource的區(qū)別

    springboot @ConfigurationProperties和@PropertySource的區(qū)別

    這篇文章主要介紹了springboot @ConfigurationProperties和@PropertySource的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java顯式鎖詳情

    Java顯式鎖詳情

    這篇文章主要詳細(xì)的介紹了shenJava顯式鎖常用的api及標(biāo)準(zhǔn)用法,感興趣的朋友,需要的朋友可以參考下面文章里的內(nèi)容
    2021-09-09
  • SpringMVC使用JsonView針對統(tǒng)一實(shí)體返回不同信息

    SpringMVC使用JsonView針對統(tǒng)一實(shí)體返回不同信息

    這篇文章主要為大家介紹了SpringMVC使用JsonView針對統(tǒng)一實(shí)體返回不同信息,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java加載屬性配置properties文件的方法

    java加載屬性配置properties文件的方法

    這篇文章主要介紹了java加載屬性配置properties文件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Springboot整合Swagger3全注解配置(springdoc-openapi-ui)

    Springboot整合Swagger3全注解配置(springdoc-openapi-ui)

    本文主要介紹了Springboot整合Swagger3全注解配置(springdoc-openapi-ui),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot http post請求數(shù)據(jù)大小設(shè)置操作

    SpringBoot http post請求數(shù)據(jù)大小設(shè)置操作

    這篇文章主要介紹了SpringBoot http post請求數(shù)據(jù)大小設(shè)置操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringMVC中的HandlerMappingIntrospector工具類詳解

    SpringMVC中的HandlerMappingIntrospector工具類詳解

    這篇文章主要介紹了SpringMVC中的HandlerMappingIntrospector工具類詳解,這是一個(gè)Spring MVC助手類,用于集合應(yīng)用所配置的HandlerMapping(url pattern和請求處理handler之間的映射)表,用于獲取針對某個(gè)請求的如下信息,需要的朋友可以參考下
    2023-12-12

最新評論

乌恰县| 蛟河市| 元江| 砚山县| 长宁区| 蓝山县| 阿勒泰市| 二手房| 余庆县| 澎湖县| 龙海市| 监利县| 惠东县| 潮安县| 澄迈县| 始兴县| 蒲江县| 钟山县| 清远市| 周口市| 祁门县| 苍溪县| 岳普湖县| 喀什市| 城固县| 雅江县| 青神县| 益阳市| 晋江市| 滨海县| 吴桥县| 达州市| 上高县| 宁武县| 中牟县| 铁岭县| 道真| 资兴市| 宝坻区| 靖西县| 体育|