標籤:介面 重要 oid 實現 修飾符 功能 動作類 弊端 區別
介面
介面是功能的集合,同樣可看做是一種資料類型,是比抽象類別更為抽象的”類”。
介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的實作類別(相當於介面的子類)來完成。這樣將功能的定義與實現分離,最佳化了程式設計。
一切事物均有功能,即一切事物均有介面。
介面的定義:
與定義類的class不同,介面定義時需要使用interface關鍵字。
定義介面所在的仍為.java檔案,雖然聲明時使用的為interface關鍵字的編譯後仍然會產生.class檔案。這點可以讓我們將介面看做是一種只包含了功能聲明的特殊類。
定義格式:
public interface 介面名 {
抽象方法1;
抽象方法2;
抽象方法3;
}
使用interface代替了原來的class,其他步驟與定義類相同:
l 介面中的方法均為公用訪問的抽象方法
l 介面中無法定義普通的成員變數
類實現介面
類與介面的關係為實現關係,即類實現介面。實現的動作類似繼承,只是關鍵字不同,實現使用implements。
其他類(實作類別)實現介面後,就相當於聲明:”我應該具備這個介面中的功能”。實作類別仍然需要重寫方法以實現具體的功能。
格式:
class 類 implements 介面 {
重寫介面中方法
}
在類實現介面後,該類就會將介面中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯。
l 介面中定義功能,當需要具有該功能時,可以讓類實現該介面,只聲明了應該具備該方法,是功能的聲明。
l 在具體實作類別中重寫方法,實現功能,是方法的具體實現。
於是,通過以上兩個動作將功能的聲明與實現便分開了。(此時請重新思考:類是現實事物的描述,介面是功能的集合。)
介面中成員的特點:
1、介面中可以定義變數,但是變數必須有固定的修飾符修飾,public static final 所以介面中的變數也稱之為常量,其值不能改變。後面我們會講解static與final關鍵字
2、介面中可以定義方法,方法也有固定的修飾符,public abstract
3、介面不可以建立對象。
4、子類必須覆蓋掉介面中所有的抽象方法後,子類才可以執行個體化。否則子類是一個抽象類別。
interface Demo { ///定義一個名稱為Demo的介面。 public static final int NUM = 3;// NUM的值不能改變 public abstract void show1(); public abstract void show2();}//定義子類去覆蓋介面中的方法。類與介面之間的關係是 實現。通過 關鍵字 implementsclass DemoImpl implements Demo { //子類實現Demo介面。 //重寫介面中的方法。 public void show1(){} public void show2(){}} 介面的多實現
介面最重要的體現:解決多繼承的弊端。將多繼承這種機制在java中通過多實現完成了。
interface Fu1{ void show1();}interface Fu2{ void show2();}class Zi implements Fu1,Fu2// 多實現。同時實現多個介面。{ public void show1(){} public void show2(){}}
怎麼解決多繼承的弊端呢?
弊端:多繼承時,當多個父類中有相同功能時,子類調用會產生不確定性。
其實核心原因就是在於多繼承父類中功能有主體,而導致調用運行時,不確定運行哪個主體內容。
為什麼多實現能解決了呢?
因為介面中的功能都沒有方法體,由子類來明確。
類繼承類同時實現介面
當一個類已經繼承了一個父類,它又需要擴充額外的功能,這時介面就派上用場了。
子類通過繼承父類擴充功能,通過繼承擴充的功能都是子類應該具備的基礎功能。如果子類想要繼續擴充其他類中的功能呢?這時通過實現介面來完成。
class Fu { public void show(){}}interface Inter { pulbic abstract void show1();}class Zi extends Fu implements Inter { public void show1() { }}
介面的出現避免了單繼承的局限性。父類中定義的事物的準系統。介面中定義的事物的擴充功能。
介面的多繼承
多個介面之間可以使用extends進行繼承。
interface Fu1{ void show();}interface Fu2{ void show1();}interface Fu3{ void show2();}interface Zi extends Fu1,Fu2,Fu3{ void show3();}
在開發中如果多個介面中存在相同方法,這時若有個類實現了這些介面,那麼就要實現介面中的方法,由於介面中的方法是抽象方法,子類實現後也不會發生調用的不確定性。
介面的好處:
介面的出現事項了擴充功能
介面的出現降低了耦合性,即裝置與裝置之間事項瞭解耦.
介面的出現方便後期的使用和維護,介面實際是一種暴露出來的規則.
介面和抽象的特點:
都位於繼承的頂端,用於被其他類實現或繼承
都不能直接執行個體化對象
都包含抽象方法,其子類都必須重寫這些抽象方法.
區別:
抽象類別為部分方法提供實現,避免子類重複實現這些方法,提高代碼重用性,介面只包含抽象方法.
一個類只能繼承一個直接父類(可能是抽象類別)卻可以實現多個介面,避免了java的單繼承
抽象類別是這個事物中應該具備的內容,繼承體系是is...a的關係
介面是這個事物額外內容,繼承體系是like...a的關係
二者的選用:
優先選用介面,少用抽象類別
需要定義子類的行為又要為子類提供共性功能時才用抽象類別.
JAVA-基礎-介面