標籤:動物 結構 public 方向 一個 邏輯 基類 new body
我們都知道 Java 中有三大特性,那就是繼承 ,封裝和多態 。那我今天我就來說說這幾個特性 。
老樣子 ,先問問自己為什麼會存在這些特性 。首先說封裝 ,封裝就是使用許可權修飾符來實現對屬性的隱藏 ,同時提供一些共有的 get / set 方法來對資料進行訪問 。這樣怎麼實現封裝的效果的呢 ?我們可以在 get 或 set 方法內部添加一些邏輯控制語句 。比方說在設定年齡的時候 ,我就限制傳入的 age 不能大於 120 。代碼實現可以這樣寫 。
public void setAge(int age){ if(age > 120){ this.age = 120; }}public int getAge(){ if(this.gender == "女"){ System.out.println("女孩子的年齡是你能看的?"); return -1; } return this.age;}
這隻是一個簡單的執行個體 ,實際情況是可以最佳化的 。比方說對小於零的 age 進行限制 。所以我們可以看到對資料的封裝有以下優點 ,對成員進行精密的控制且隱藏了實現細節 ,還可以自由的修改方法的內部實現 。
就像是兒子繼承老子的財富那樣 ,子類也可以繼承父類的屬性和方法 ,但是有些是不能繼承的 ,這要回到前面看一看存取修飾詞的問題了 。在 Java 中只允許單繼承 ,就是只能有一個老子 。繼承是怎麼實現的 ?為什麼要有繼承 ?我們通過 extends 關鍵字來標識繼承的父類 。而且繼承是可以傳遞的 ,A 繼承 B ,B 繼承 C ,那麼 C 也是 A 的父類 。父類也叫超類 ,子類也叫基類 。Object 是所有類的超類 。在子類中調用和父類同名的方法時 ,執行的是子類的方法 ,而可以顯示的使用 super 來調用父類的方法 。
繼承的優點顯而易見 ,可以增加代碼的複用性 ,但是我們不能為了繼承而去繼承 ,還要注意繼承和組合的概念 ,繼承是 “ is a ” 的概念 ,比方說 cat is a animal . 而組合是 “ has a ” 的概念 ,比方說 our body has a leg . 以上兩句話可以設計出如下的結構 。
class Animal { sleep(){ System.print.out("動物睡覺"); }}// 表示貓是動物class Cat extends Animal{ sleep(){ System.print.out("貓睡覺"); }}class Leg{}// 表示身體裡有腿class Body{ Leg leg = new Leg();}
而最後一個就是多態 ,同樣的問自己 ,什麼是多態 ?多態有什麼用 ?顧名思義 ,多態就是多種狀態 。就像是同樣的早晨有時候你是精神滿滿而有時候你是萎靡不振一樣 ,我們在調用同一個方法的時候 ,很可能執行的情況也不一樣 。這就是 Java 中說的多態 。那為什麼會不一樣呢 ?還記得剛剛說的子類繼承父類的方法吧 ,子類在繼承父類方法之後 ,可以對其進行重寫 ,當我們調用重寫的方法時 ,啟動並執行結果就和父類的結果不一樣 。所以說 ,你想要多態 ,先要有繼承 。還有一種多態的形式 ,我們稱之為 “ 虛擬方法調用 ” 又叫向上轉型 ,說的簡單一點就是父類的引用指向了子類對象 。像這樣 ,父類 Animal 的 a 指向了 Cat 實體 。
Animal a = new Cat();a.sleep() // 貓睡覺
需要注意的是在使用虛擬方法調用的時候不能調用父類專屬的方法 ,這會在運行時報錯 ,在編譯時間沒事 ,編譯的時候只編譯等號左邊 。但是在啟動並執行會看具體的對象 ,在子類中找不到相應的方法自然會報錯 。
可以總結一下多態的作用了 ,我們使用多態可以達到解耦合和易擴充的目的 ,我們編寫不同模組的功能 ,在調用的時候只需要將父類的引用變個方向就行 。只需提供穩定的子類實現 ,父類只負責調用相應的介面方法就行 。這也就是工廠設計模式的原理 。
Java 中的三大特性