介面: 暫時可以理解為是一種特殊的抽象類 介面是功能的集合,可以看作是一種數據類型,是比抽象類更抽象的“類” 介面只描述所應該具備的方法,並沒有具體實現,具體實現由介面的實現類(相當於介面的子類)來完成 這樣將功能的實現與定義分離,優化了程式設計 介面的成員方法全抽象,不能存在帶有方法體的方法 介面 ...
介面:
暫時可以理解為是一種特殊的抽象類
介面是功能的集合,可以看作是一種數據類型,是比抽象類更抽象的“類”
介面只描述所應該具備的方法,並沒有具體實現,具體實現由介面的實現類(相當於介面的子類)來完成
這樣將功能的實現與定義分離,優化了程式設計
介面的成員方法全抽象,不能存在帶有方法體的方法
介面中無法定義普通的成員變數,必須定義為常量
介面定義抽象方法有固定格式
一切事物皆有功能,即一切事物都有介面
介面的定義規則:
public interface MyInterface { public static final int a = 1; public abstract void function(); }
介面的實現類(類和類之間叫繼承,類和介面之間叫實現):
public class MyInterfaceImpl implements MyInterface{ public void function(){ System.out.println("實現類,重寫介面方法"); } }
測試:
public class Test { public static void main(String[] args) { MyInterfaceImpl my = new MyInterfaceImpl(); my.function(); } }
介面中成員變數的特點:
註意這裡的public static final三個修飾詞可以省略任意個數,但是效果不變,總是public static final,建議寫全
public interface MyInter { //靜態的可以用.方式訪問 //final表示不能被修改 public static final int x = 3; }
測試:
public class Test { public static void main(String[] args) { //靜態的可以用.方式訪問,具體關於static在後邊講 System.out.println(MyInter.x); } }
介面中成員方法的特點:
註意這裡的public abstract也是選擇性書寫的,無論怎樣效果都是public abstract,建議寫全
public interface MyInter { public abstract void function(); }
實現類,實現介面,重寫介面全部抽象方法,創建實現類對象
介面不可以創建對象
子類必須覆蓋掉介面中所有的抽象方法後,子類才可以實例化,否則子類是一個抽象類
介面的多實現:
介面最重要的體現:解決多繼承的弊端,將多繼承這種機制在java中通過多實現完成了
解決安全隱患原理:介面中的方法全都是抽象的,沒有主體,方法依賴實現類的重寫才可以實現,因此沒有安全問題
因此介面的多實現解決了單繼承的局限性
舉例:
介面A:
public interface A { public abstract void a(); public abstract void c(); }
介面B:
public interface B { public abstract void a(); public abstract void b(); }
多實現:
/* * 類C,同時實現兩個介面,介面A,B * 作為實現類,C必須重寫兩個介面的所有抽象方法,才可以建立C類對象 * */ public class C implements A, B { public void a() { } public void b() { } public void c() { } }
類繼承類的同時,還可以實現介面:
類D:
public abstract class D { public abstract void d(); }
C:
//在繼承一個類(只能是一個)的同時,實現多個介面 public class C extends D implements A, B { public void a() { } public void b() { } public void c() { } public void d() { } }
介面存在多繼承:
由於介面的方法都是抽象的,所以不存在安全隱患
public interface A { public abstract void a(); }
public interface B { public abstract void b(); }
public interface C extends A,B{ public abstract void c(); }
public class D implements C{ public void a(){} public void b(){} public void c(){} }
這裡有一個有關java的問題:
java中到底存在多繼承嗎?
答:類沒有多繼承,介面之間存在多繼承
介面的思想:
舉例:電腦上有多個插口,這些插口可以插入相應的設備,因為這些設備生產的時候符合了這個插口的使用規則,否則無法插入使用
介面在開發中的好處:
1.介面的出現擴展了功能
2.介面其實就是暴漏出來的規則
3.介面的出現降低了耦合性,設備與設備之間實現瞭解耦(筆記本電腦USB插口是否被使用電腦都可以運行)
介面和抽象類的共同點:
1.都位於繼承的頂端,用於被其他類實現或繼承
2.都不能直接實例化對象
3.都包含抽象方法,其子類都必須覆寫這些抽象方法
區別:
1.抽象類為部分方法提供實現,避免子類重覆實現這些方法,提高代碼的重用性;而介面只能包含抽象方法
2.一個類只能繼承一個直接父類(可能是抽象類),卻可以實現多個介面,介面彌補了java的單繼承
思想方面的區別:
抽象類是這個事物中應該具備的內容,繼承體系是一種is..a的關係
介面是這個事物中的額外內容,繼承體系是一種like...a的關係
偽代碼舉例:class 賊 extends 人 implements 偷盜
賊本身是一個人,他可以偷盜,不是所有的人都偷盜
選用:
1.優先使用介面,儘量少用抽象類
2.需要定義子類的行為,又要為子類提供共性功能時,選用抽象類