java 介面
一、Java介面基礎知識
1, Java語言不支援一個類有多個直接的父類(多繼承),但可以實現(implements)多個介面,間接的實現了多繼承.
2, 與Java介面相關的設計模式:
1, 定製服務模式
設計精粒度的介面,每個Java介面代表相關的一組服務,通過繼承來建立複合介面
2, 介面卡模式
當每個系統之間介面不匹配時,用介面卡來轉換介面
3, 預設介面卡模式
為介面提供簡單的預設實現
4, 代理模式
為Java介面的實現類建立代理類,使用者通過代理來獲得實現類的服務
5, 標識型別模式
用介面來標識一種沒有任何行為的抽象型別
6, 常量介面模式
在介面中定義靜態常量,在其它類中通過import static語句引入這些常量
Java介面的特徵歸納:
1, Java介面中的成員變數預設都是public,static,final型別的(都可省略),必須被顯示初始化,即介面中的成員變數為常量(大寫,單詞之間用"_"分隔)
2, Java介面中的方法預設都是public,abstract型別的(都可省略),沒有方法體,不能被例項化
- public interface A
- {
- int CONST = 1; //合法,CONST預設為public,static,final型別
- void method(); //合法,method()預設為public,abstract型別
- public abstract void method2(); //method2()顯示宣告為public,abstract型別
- }
3, Java介面中只能包含public,static,final型別的成員變數和public,abstract型別的成員方法
- public interface A
- {
- int var; //錯,var是常量,必須顯示初始化
- void method(){...}; //錯,介面中只能包含抽象方法
- protected void method2(); //錯,介面中的方法必須是public型別
- static void method3(){...}; //錯,介面中不能包含靜態方法
- }
4, 介面中沒有構造方法,不能被例項化
- public interface A
- {
- public A(){...}; //錯,介面中不能包含構造方法
- void method();
- }
5, 一個介面不能實現(implements)另一個介面,但它可以繼承多個其它的介面
- public interface A
- {
- void methodA();
- }
- public interface B
- {
- void methodB();
- }
- public interface C extends A, B //C稱為複合介面
- {
- void methodC();
- }
- public interface C implements A{...} //錯
6, Java介面必須通過類來實現它的抽象方法
public class A implements B{...}
7, 當類實現了某個Java介面時,它必須實現介面中的所有抽象方法,否則這個類必須宣告為抽象的
8, 不允許建立介面的例項(例項化),但允許定義介面型別的引用變數,該引用變數引用實現了這個介面的類的例項
- public class B implements A{}
- A a = new B(); //引用變數a被定義為A介面型別,引用了B例項
- A a = new A(); //錯誤,介面不允許例項化
9, 一個類只能繼承一個直接的父類,但可以實現多個介面,間接的實現了多繼承.
public class A extends B implements C, D{...} //B為class,C,D為interface
4, 通過介面,可以方便地對已經存在的系統進行自下而上的抽象,對於任意兩個類,不管它們是否屬於同一個父類,只有它們存在相同的功能,就能從中抽象出一個介面型別.對於已經存在的繼承樹,可以方便的從類中抽象出新的介面,但從類中抽象出新的抽象類卻不那麼容易,因此介面更有利於軟體系統的維護與重構.對於兩個系統,通過介面互動比通過抽象類互動能獲得更好的鬆耦合.
5, 介面是構建鬆耦合軟體系統的重要法寶,由於介面用於描述系統對外提供的所有服務,因此介面中的成員變數和方法都必須是public型別的,確保外部使用者能訪問它們,介面僅僅描述系統能做什麼,但不指明如何去做,所有介面中的方法都是抽象方法,介面不涉及和任何具體例項相關的細節,因此介面沒有構造方法,不能被例項化,沒有例項變數.
二, 比較抽象類與介面
1, 抽象類與介面都位於繼承樹的上層
相同點
1, 代表系統的抽象層,當一個系統使用一顆繼承樹上的類時,應該儘量把引用變數宣告為繼承樹的上層抽象型別,這樣可以提高兩個系統之間的送耦合
2, 都不能被例項化
3, 都包含抽象方法,這些抽象方法用於描述系統能提供哪些服務,但不提供具體的實現
不同點:
1, 在抽象類中可以為部分方法提供預設的實現,從而避免在子類中重複實現它們,這是抽象類的優勢,但這一優勢限制了多繼承,而介面中只能包含抽象方法.由於在抽象類中允許加入具體方法,因此擴充套件抽象類的功能,即向抽象類中新增具體方法,不會對它的子類造成影響,而對於介面,一旦介面被公佈,就必須非常穩定,因為隨意在介面中新增抽象方法,會影響到所有的實現類,這些實現類要麼實現新增的抽象方法,要麼宣告為抽象類
2, 一個類只能繼承一個直接的父類,這個父類可能是抽象類,但一個類可以實現多個介面,這是介面的優勢,但這一優勢是以不允許為任何方法提供實現作為代價的三, 為什麼Java語言不允許多重繼承呢?當子類覆蓋父類的例項方法或隱藏父類的成員變數及靜態方法時,Java虛擬機器採用不同的繫結規則,假如還允許一個類有多個直接的父類,那麼會使繫結規則更加複雜,
因此,為了簡化系統結構設計和動態繫結機制,Java語言禁止多重繼承.而介面中只有抽象方法,沒有例項變數和靜態方法,只有介面的實現類才會實現介面的抽象方法(介面中的抽象方法是通過類來實現的),因此,一個類即使有多個介面,也不會增加Java虛擬機器進行動態繫結的複雜度.因為Java虛擬機器永遠不會把方法與介面繫結,而只會把方法與它的實現類繫結.四, 使用介面和抽象類的總體原則:
1, 用介面作為系統與外界互動的視窗站在外界使用者(另一個系統)的角度,介面向使用者承諾系統能提供哪些服務,站在系統本身的角度,介面制定系統必須實現哪些服務,介面是系統中最高層次的抽象型別.通過介面互動可以提高兩個系統之間的送耦合系統A通過系統B進行互動,是指系統A訪問系統B時,把引用變數宣告為系統B中的介面型別,該引用變數引用系統B中介面的實現類的例項。
- public interface B
- {
- }
- public class C implements B
- {
- }
- public class A
- {
- }
- B a = new C();
相關文章
- java介面Java
- java之介面Java
- Java 自學 - 介面與繼承 介面Java繼承
- Java學習--java中的集合框架、Collection介面、list介面Java框架
- 【Java】標記介面Java
- Java™ 教程(Collection介面)Java
- Java™ 教程(Set介面)Java
- 介面的使用(Java)Java
- JAVA集合——Map介面Java
- Java的Future介面Java
- java基礎-介面Java
- Java-介面(interface)Java
- java介面例項Java
- java介面回撥Java
- Java中ListIterator介面Java
- Java中的介面Java
- java 工資-介面Java
- java之介面interfaceJava
- java 介面(翻譯自Java Tutorials)Java
- 類與介面(三)java中的介面與巢狀介面Java巢狀
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- JAVA集合框架 - Map介面Java框架
- Java 版抖音解析介面Java
- Java函式式介面Java函式
- Java筆記 介面(更新)Java筆記
- Java 介面與抽象方法Java抽象
- Java學習之介面Java
- Java的抽象類 & 介面Java抽象
- java中的interface(介面)Java
- Java繼承和介面Java繼承
- Java介面與陣列Java陣列
- 如何理解介面-Java系列Java
- java.lang.Runnable介面Java
- Java線上教程--介面篇Java
- java介面巢狀【Z】Java巢狀
- JAVA的類和介面Java
- java介面的妙用 (轉)Java
- Java介面程式設計Java程式設計