深刻解析Java接口(interface)的應用。本站提示廣大學習愛好者:(深刻解析Java接口(interface)的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析Java接口(interface)的應用正文
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類,將沒無機會繼續其他父類了。
綜上所述,接口和籠統類各有優缺陷,在接口和籠統類的選擇上,必需遵照如許一個准繩:
行動模子應當老是經由過程接口而不是籠統類界說,所以平日是優先選用接口,盡可能罕用籠統類。
選擇籠統類的時刻平日是以下情形:須要界說子類的行動,又要為子類供給通用的功效。