Java學習筆記10(物件導向三:介面),java學習筆記
介面:
暫時可以理解為是一種特殊的抽象類別
介面是功能的集合,可以看作是一種資料類型,是比抽象類別更抽象的“類”
介面只描述所應該具備的方法,並沒有具體實現,具體實現由介面的實作類別(相當於介面的子類)來完成
這樣將功能的實現與定義分離,最佳化了程式設計
介面的成員方法全抽象,不能存在帶有方法體的方法
介面中無法定義普通的成員變數,必須定義為常量
介面定義抽象方法有固定格式
一切事物皆有功能,即一切事物都有介面
介面的定義規則:
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.需要定義子類的行為,又要為子類提供共性功能時,選用抽象類別