這一篇總結java的三大特性:繼承、封裝和多態 繼承 1.使用場景 分析兩者關系,若為IS-A型,就應使用繼承。 比如,貓是動物的一種,它理應擁有動物最基本的屬性和功能,所以構造Cat類時就可以繼承已有的Animal類,在其基礎上做擴展。Cat類就稱為子類,Animal類就稱為父類。
2.特點 繼承很方便的實現了代碼復用,子類可以直接獲得父類的已有功能,不需自己實現,然后再擴展自己獨有的功能就好,效率提高。 但這是一種強耦合關系,因為父類的實現對子類是透明的,父類變動則所有子類均受變動,而且Java有單繼承限制,一個類只能有一個父類,哪怕它與很多類有IS-A關系。
3.子類真正繼承了什么? 一個類中的內容可大致分為三部分:屬性,方法和構造器。就從這三方面分析子類真正繼承了什么。 屬性和方法:只要是非PRivate型的,不論是否靜態或者其他,均可以由子類繼承使用。當然子類可以對已繼承的屬性和方法進行覆蓋,換成自己的實現。 構造器:構造器只能調用,不可繼承。Java有構造方法鏈,編譯器會從父類的構造方法開始向子類一級一級完成構建,這是必須的,對父類構造方法的調用一定是子類構造方法中的第一行代碼。當然,如果父類有默認的空參構造器,編譯器會默認調用不需我們手動調用,但若父類沒有,則必須手動調用:super(XXX).
4.要牢記的幾點 IS-A型關系下才應使用繼承;子類繼承到的是父類非private的屬性和方法;子類可以自由擴展,添加自己的屬性和方法;子類可以覆蓋繼承到的屬性和方法,換成自己想要的實現。
封裝 1.使用場景 對象有自己的屬性和方法,當我們需要對這些信息加以保護或者限制外界的訪問權限時,就要使用封裝。 比如,對一些重要實現邏輯客戶不能更改也不必知道,就可以使用private修飾符,對一些重要屬性客戶只能讀不能寫,就可使用private修飾符外加get方法。
2.優勢 減少互相間的依賴,降低耦合,容易維護和使用。內部邏輯更改迭代不會影響客戶的使用;控制了客戶權限,安全性提高。
3.四種修飾符 在控制客戶訪問權限時,最常用到的是四種修飾符,訪問權限由大到小為: public>protected>void>private 其中,public型無限制,protected型限制為子類或者包內可訪問,void型限制包內可以訪問,private型限制僅類中可訪問。
多態: 1.什么是多態 以子類Cat類與父類Animal類為例,以下寫法是正確的: Animal a=new Cat(); 一個變量一般有聲明類型和實際類型兩種屬性,如上代碼,變量a的聲明類型為Animal,實際類型為Cat,這是多態的一部分體現。
所謂多態,是指變量的實際類型及變量最終會調用何處的實現(屬性和方法等)只有在運行期間才確定,編譯時并不確定。正因為運行時才確定,所以無需更改邏輯代碼,運行狀態(可以理解為run起來的代碼)就會隨變量實際類型的改變而改變,這就是多態性。
舉個簡單例子: public void runEat(Animal a){ a.eat(); } 上面的方法,傳入Cat型參數,運行時執行的就是Cat類中eat方法,傳入Dog型參數,就會執行Dog類中的eat方法了。
如上,若eat方法只存在于Animal類,沒有問題,最后調用的就是Animal類中的eat方法;若只存在于Cat類,則會報錯,因為向上轉型后,a無法直接調用子類中的方法,編譯失敗,必須先進行類型強轉后才可;那若Animal類和Cat類中均有eat方法呢,調用的是Animal類還是Cat類中的呢?編譯和運行時一樣嗎?調用屬性時又是什么情況?
不論聲明類型與實際類型是否一致,對屬性來說:編譯檢測和運行調用均看聲明類型,無論靜態與否;對方法來說:則要區分靜態與否,靜態下編譯檢測和運行調用均看聲明類型,非靜態下編譯檢測看聲明類型,運行調用看實際類型。 總結:屬性+靜態方法,均看左邊;非靜態方法,編譯看左邊,運行用右邊
3.實現形式 Java中有兩種形式可以實現多態:繼承和接口。 繼承代表IS—A型關系,接口代表HAS—A型關系。比如,新陳代謝這個功能,貓有,樹木也有,他們與新陳代謝之間就是典型的HAS—A型關系,所以就應該用接口實現。相對于繼承,接口可以多實現,就是說一個類只能繼承一個父類但可以實現多個接口,這樣就有更靈活的擴充性和組合性。 不過兩者形式下的多態均遵從上面2中總結的結論
新聞熱點
疑難解答