亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

深入解析Java接口(interface)的使用

2019-11-26 14:57:53
字體:
來源:轉載
供稿:網友

Java接口(interface)的概念及使用
在抽象類中,可以包含一個或多個抽象方法;但在接口(interface)中,所有的方法必須都是抽象的,不能有方法體,它比抽象類更加“抽象”。

接口使用 interface 關鍵字來聲明,可以看做是一種特殊的抽象類,可以指定一個類必須做什么,而不是規定它如何去做。

現實中也有很多接口的實例,比如說串口電腦硬盤,Serial ATA委員會指定了Serial ATA 2.0規范,這種規范就是接口。Serial ATA委員會不負責生產硬盤,只是指定通用的規范。

希捷、日立、三星等生產廠家會按照規范生產符合接口的硬盤,這些硬盤就可以實現通用化,如果正在用一塊160G日立的串口硬盤,現在要升級了,可以購買一塊320G的希捷串口硬盤,安裝上去就可以繼續使用了。

下面的代碼可以模擬Serial ATA委員會定義以下串口硬盤接口:

//串行硬盤接口public interface SataHdd{ //連接線的數量 public static final int CONNECT_LINE=4; //寫數據 public void writeData(String data); //讀數據 public String readData();}

注意:接口中聲明的成員變量默認都是 public static final 的,必須顯示的初始化。因而在常量聲明時可以省略這些修飾符。

接口是若干常量和抽象方法的集合,目前看來和抽象類差不多。確實如此,接口本就是從抽象類中演化而來的,因而除特別規定,接口享有和類同樣的“待遇”。比如,源程序中可以定義多個類或接口,但最多只能有一個public 的類或接口,如果有則源文件必須取和public的類和接口相同的名字。和類的繼承格式一樣,接口之間也可以繼承,子接口可以繼承父接口中的常量和抽象方法并添加新的抽象方法等。

但接口有其自身的一些特性,歸納如下。

1) 接口中只能定義抽象方法,這些方法默認為 public abstract 的,因而在聲明方法時可以省略這些修飾符。試圖在接口中定義實例變量、非抽象的實例方法及靜態方法,都是非法的。例如:

public interface SataHdd{ //連接線的數量 public int connectLine; //編譯出錯,connectLine被看做靜態常量,必須顯式初始化 //寫數據 protected void writeData(String data); //編譯出錯,必須是public類型 //讀數據 public static String readData(){ //編譯出錯,接口中不能包含靜態方法  return "數據"; //編譯出錯,接口中只能包含抽象方法, }}

3) 接口中沒有構造方法,不能被實例化。

4) 一個接口不實現另一個接口,但可以繼承多個其他接口。接口的多繼承特點彌補了類的單繼承。例如:

//串行硬盤接口public interface SataHdd extends A,B{ // 連接線的數量 public static final int CONNECT_LINE = 4; // 寫數據 public void writeData(String data); // 讀數據 public String readData();}interface A{ public void a();}interface B{ public void b();}

為什么使用接口

大型項目開發中,可能需要從繼承鏈的中間插入一個類,讓它的子類具備某些功能而不影響它們的父類。例如 A -> B -> C -> D -> E,A 是祖先類,如果需要為C、D、E類添加某些通用的功能,最簡單的方法是讓C類再繼承另外一個類。但是問題來了,Java 是一種單繼承的語言,不能再讓C繼承另外一個父類了,只到移動到繼承鏈的最頂端,讓A再繼承一個父類。這樣一來,對C、D、E類的修改,影響到了整個繼承鏈,不具備可插入性的設計。

接口是可插入性的保證。在一個繼承鏈中的任何一個類都可以實現一個接口,這個接口會影響到此類的所有子類,但不會影響到此類的任何父類。此類將不得不實現這個接口所規定的方法,而子類可以從此類自動繼承這些方法,這時候,這些子類具有了可插入性。

我們關心的不是哪一個具體的類,而是這個類是否實現了我們需要的接口。

接口提供了關聯以及方法調用上的可插入性,軟件系統的規模越大,生命周期越長,接口使得軟件系統的靈活性和可擴展性,可插入性方面得到保證。

接口在面向對象的 Java 程序設計中占有舉足輕重的地位。事實上在設計階段最重要的任務之一就是設計出各部分的接口,然后通過接口的組合,形成程序的基本框架結構。
接口的使用

接口的使用與類的使用有些不同。在需要使用類的地方,會直接使用new關鍵字來構建一個類的實例,但接口不可以這樣使用,因為接口不能直接使用 new 關鍵字來構建實例。

接口必須通過類來實現(implements)它的抽象方法,然后再實例化類。類實現接口的關鍵字為implements。

如果一個類不能實現該接口的所有抽象方法,那么這個類必須被定義為抽象方法。

不允許創建接口的實例,但允許定義接口類型的引用變量,該變量指向了實現接口的類的實例。

一個類只能繼承一個父類,但卻可以實現多個接口。

實現接口的格式如下:
修飾符 class 類名 extends 父類 implements 多個接口 {
    實現方法
}

請看下面的例子:

import static java.lang.System.*;public class Demo{ public static void main(String[] args) {  SataHdd sh1=new SeagateHdd(); //初始化希捷硬盤  SataHdd sh2=new SamsungHdd(); //初始化三星硬盤 }}//串行硬盤接口interface SataHdd{ //連接線的數量 public static final int CONNECT_LINE=4; //寫數據 public void writeData(String data); //讀數據 public String readData();}// 維修硬盤接口interface fixHdd{ // 維修地址 String address = "北京市海淀區"; // 開始維修 boolean doFix();}//希捷硬盤class SeagateHdd implements SataHdd, fixHdd{ //希捷硬盤讀取數據 public String readData(){  return "數據"; } //希捷硬盤寫入數據 public void writeData(String data) {  out.println("寫入成功"); } // 維修希捷硬盤 public boolean doFix(){  return true; }}//三星硬盤class SamsungHdd implements SataHdd{ //三星硬盤讀取數據 public String readData(){  return "數據"; } //三星硬盤寫入數據 public void writeData(String data){  out.println("寫入成功"); }}//某劣質硬盤,不能寫數據abstract class XXHdd implements SataHdd{ //硬盤讀取數據 public String readData() {  return "數據"; }}

接口作為類型使用

接口作為引用類型來使用,任何實現該接口的類的實例都可以存儲在該接口類型的變量中,通過這些變量可以訪問類中所實現的接口中的方法,Java 運行時系統會動態地確定應該使用哪個類中的方法,實際上是調用相應的實現類的方法。

示例如下:

public class Demo{ public void test1(A a) {  a.doSth(); } public static void main(String[] args) {  Demo d = new Demo();  A a = new B();  d.test1(a); }}interface A { public int doSth();}class B implements A { public int doSth() {  System.out.println("now in B");  return 123; }}

運行結果:

now in B

大家看到接口可以作為一個類型來使用,把接口作為方法的參數和返回類型。


Java接口和抽象類的區別
類是對象的模板,抽象類和接口可以看做是具體的類的模板。

由于從某種角度講,接口是一種特殊的抽象類,它們的淵源頗深,有很大的相似之處,所以在選擇使用誰的問題上很容易迷糊。我們首先分析它們具有的相同點。
都代表類樹形結構的抽象層。在使用引用變量時,盡量使用類結構的抽象層,使方法的定義和實現分離,這樣做對于代碼有松散耦合的好處。
都不能被實例化。
都能包含抽象方法。抽象方法用來描述系統提供哪些功能,而不必關心具體的實現。

下面說一下抽象類和接口的主要區別。

1) 抽象類可以為部分方法提供實現,避免了在子類中重復實現這些方法,提高了代碼的可重用性,這是抽象類的優勢;而接口中只能包含抽象方法,不能包含任何實現。

public abstract class A{ public abstract void method1(); public void method2(){  //A method2 }}public class B extends A{ public void method1(){  //B method1 }}public class C extends A{ public void method1(){  //C method1 }}

抽象類A有兩個子類B、C,由于A中有方法method2的實現,子類B、C中不需要重寫method2方法,我們就說A為子類提供了公共的功能,或A約束了子類的行為。method2就是代碼可重用的例子。A 并沒有定義 method1的實現,也就是說B、C 可以根據自己的特點實現method1方法,這又體現了松散耦合的特性。

再換成接口看看:

public interface A{ public void method1(); public void method2();}public class B implements A{ public void method1(){  //B method1 } public void method2(){  //B method2 }}public class C implements A{ public void method1(){  //C method1 } public void method2(){  //C method2 }}

接口A無法為實現類B、C提供公共的功能,也就是說A無法約束B、C的行為。B、C可以自由地發揮自己的特點現實 method1和 method2方法,接口A毫無掌控能力。

2) 一個類只能繼承一個直接的父類(可能是抽象類),但一個類可以實現多個接口,這個就是接口的優勢。

interface A{ public void method2();}interface B{ public void method1();}class C implements A,B{ public void method1(){  //C method1 } public void method2(){  //C method2 }}//可以如此靈活的使用C,并且C還有機會進行擴展,實現其他接口A a=new C();B b=new C();abstract class A{ public abstract void method1();}abstract class B extends A{ public abstract void method2();}class C extends B{ public void method1(){  //C method1 } public void method2() {  //C method2 }}

對于C類,將沒有機會繼承其他父類了。

綜上所述,接口和抽象類各有優缺點,在接口和抽象類的選擇上,必須遵守這樣一個原則:
行為模型應該總是通過接口而不是抽象類定義,所以通常是優先選用接口,盡量少用抽象類。
選擇抽象類的時候通常是如下情況:需要定義子類的行為,又要為子類提供通用的功能。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩欧美在线播放| 精品香蕉一区二区三区| 国产欧美一区二区三区四区| 91社区国产高清| 日韩精品中文字幕在线播放| 欧美视频免费在线| 亚洲国语精品自产拍在线观看| zzjj国产精品一区二区| 亚洲免费av网址| 亚洲天堂久久av| 欧美视频精品一区| 亚洲午夜精品久久久久久性色| 国产精品中文字幕久久久| 色悠悠久久88| 日韩中文字幕在线播放| 欧美大片第1页| 国产精品精品久久久| 欧美久久精品午夜青青大伊人| 日韩视频免费中文字幕| 欧美性猛交xxxx| 91久久久久久久久| 国产精品视频男人的天堂| 97超级碰碰人国产在线观看| 亚洲最大的网站| 成人免费高清完整版在线观看| 欧美日韩国产限制| 亚洲石原莉奈一区二区在线观看| 国产精品一区二区三区在线播放| 精品国产31久久久久久| 日韩视频免费在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲成色www8888| 日韩中文综合网| 91夜夜揉人人捏人人添红杏| 欧美在线视频观看| 5566日本婷婷色中文字幕97| 亚洲国产精品久久久久秋霞不卡| 国产精品第三页| 国内精品一区二区三区四区| 精品无人区乱码1区2区3区在线| 91亚洲永久免费精品| 国产成人精品a视频一区www| 亚洲3p在线观看| 久久久久久久久久久亚洲| 欧美中文字幕在线观看| 91在线高清视频| 久久久久久久久久婷婷| 中文字幕亚洲色图| 欧美劲爆第一页| 国产欧美婷婷中文| 91精品久久久久久久久久久久久久| 亚洲国产精品久久久久| 精品久久久久久中文字幕一区奶水| 成人网在线免费观看| 国产精品高清网站| 亚洲欧洲美洲在线综合| 国产精品久久久久久久久久久久| 国产精品99久久久久久www| 日本精品中文字幕| 91av在线网站| 成人久久18免费网站图片| 69久久夜色精品国产69乱青草| 日本成人激情视频| 日韩在线视频国产| 久久夜色精品国产| 亚洲福利在线看| 亚洲奶大毛多的老太婆| 亚洲天堂av女优| 亚洲国产成人精品久久久国产成人一区| 欧美中文在线视频| 午夜精品99久久免费| 亚洲精品欧美日韩专区| 大胆人体色综合| 2019中文字幕在线免费观看| 中文字幕国产亚洲| www国产91| 亚洲乱码av中文一区二区| 韩国精品久久久999| 日韩美女写真福利在线观看| 91免费国产视频| 97免费在线视频| 久久精品一本久久99精品| 久久精品2019中文字幕| 欧美多人爱爱视频网站| 国产精品视频免费在线| 欧美激情国产日韩精品一区18| 欧美激情中文字幕乱码免费| 久久久精品在线| 亚洲第一区第一页| 久久久久久国产精品| 国产精品久久久久久亚洲影视| 亚洲最大成人免费视频| 日本一区二区在线免费播放| 超碰精品一区二区三区乱码| 亚洲成年网站在线观看| 人妖精品videosex性欧美| 国产精品视频一区二区高潮| 亚洲国产99精品国自产| 亚洲人成电影网站色www| 日韩av网站导航| 国产精品扒开腿做| 日韩成人在线视频网站| 国a精品视频大全| 亚洲第一综合天堂另类专| 一本久久综合亚洲鲁鲁| 欧美日韩一区二区免费视频| 日韩欧美在线视频观看| 91在线观看免费网站| 色综合天天狠天天透天天伊人| 久久免费视频在线观看| 日韩av网站大全| 狠狠综合久久av一区二区小说| 91久久久久久久久久久| 中文字幕成人在线| 欧美乱大交做爰xxxⅹ性3| 91亚洲国产成人久久精品网站| 国产精品入口日韩视频大尺度| 成人精品久久一区二区三区| 91免费在线视频| 91麻豆国产语对白在线观看| 欧美精品做受xxx性少妇| 日韩精品视频免费| 日本午夜精品理论片a级appf发布| 亚洲自拍偷拍色图| 九九热视频这里只有精品| 一区二区三区四区在线观看视频| 国产精品美女在线| 亚洲一区二区免费| 久久久精品欧美| 中文字幕av一区| 亚洲aa中文字幕| 亚洲精品福利在线观看| 日韩电影中文字幕在线| 欧美成人国产va精品日本一级| 丝袜亚洲欧美日韩综合| 精品福利视频导航| 日韩在线中文字| 亚洲精品二三区| 中文字幕亚洲一区在线观看| 日韩午夜在线视频| 成人淫片在线看| 国产一区二区三区视频在线观看| 98精品国产高清在线xxxx天堂| 亚洲国产精品va在线看黑人动漫| 97久久超碰福利国产精品…| 日韩av毛片网| 欧美最猛性xxxxx免费| 日韩av快播网址| 国产精品嫩草视频| 精品久久久久国产| 国产成人亚洲综合| 在线观看欧美www| 中文字幕久久精品| 欧美电影免费观看网站| 91久久久久久| 国产精品青青在线观看爽香蕉| 最新国产精品亚洲| 久久精品国产视频| 91av视频在线免费观看| 一本色道久久88亚洲综合88| 亚洲精品福利免费在线观看| 热99精品只有里视频精品| 国产综合久久久久| 性欧美办公室18xxxxhd|