1. 程式人生 > >[Java] Java學習第二站:類的繼承

[Java] Java學習第二站:類的繼承

情景: 假設張老師是一家培訓機構的英語老師,她的學生有大學生、中學生和小學生。張老師很認真地為學生們建好了類,並且儲存了姓名、年齡、住址、英語水平等不同屬性和學習方法和測試方法等不同方法。而2020年北京冬奧會的申辦使得人們對學英語的熱情大增,張老師的學生種類增加了銷售人員、設計師、工程師、運動員等等……一百多個種類!顯然,為這一百多種學生建類不僅會使姓名年齡等程式碼顯得重複冗餘,張老師本身也需要對教學方法進行多次過載。怎麼辦才好呢?

這時候就需要用到類的繼承了。類的繼承就是把多個有共同點的事物中的共同點抽象出來,寫成一個父類,把這些事物抽象成類去繼承父類中的那些共同點。 對張老師而來,這一百多種類都是學生,她的工作就是為他們提高英語水平。我們可以把多種學生的共同點抽象出來,形成一個學生類,然後讓不同的類去繼承這個學生類,可以大大減少程式碼量,也可以通過處理父類型別,對所有子類型別進行處理。

使用類的繼承的好處: 1.提高程式碼重用性       將子類中的共同屬性、方法放入父類中。 2.提高程式的擴充套件性       可通過處理父類型別,對所有子類型別進行處理,可無限擴充套件子類 3.提高了程式碼的可維護性       修改時只需要修改少量程式碼即可。        子類可以繼承到父類所有的屬性和所有的普通方法,但是不包含構造方法。子類也可以繼承父類沒有的屬性和方法。

圖1  類的繼承許可權

類的繼承:       關鍵字:extends       格式:  (Java中類只能繼承一個父類)       public class 類名(子類、派生類、超類) extends 類名(父類、基類) {              } 類的繼承程式碼實現:         Student {String name; study(){} }         UNStudent extends Student { study(){} }         GStudent extends Student {  study(){} }         CStudent extends Student {   }         XStudent extends Student {   } 由程式碼可知,各種學生類繼承了Student這個類,也繼承了Student父類的name屬性和study()方法。其中,部分子類還對父類中的study()方法進行了重寫。

方法重寫:     方法重寫必須滿足的條件:         1.必須要存在繼承關係;         2.子類在重寫父類方法時,子類方法的訪問修飾符可以大於或等於父類方法的訪問修飾符;         3.子類在重寫父類方法時,子類方法的返回值資料型別,方法名,引數都必須要和父類的完全一致;         4.子類方法中的具體實現要和父類不同。        

圖2  eclipse重寫標誌(綠色小三角)

既然重寫後的子類方法與父類方法一致,那我們怎麼知道我們呼叫的是哪一個方法呢? 根據new關鍵字後的類名來決定,如果類名是子類的,則優先呼叫子類的方法,如果子類沒有才呼叫父類中的方法。

圖3 方法重寫後的呼叫

自動型轉 父類的型別名可以引用一個子類的物件,用的就是自動型轉。     自動轉型的格式:         父類名  物件名  = new 子類名();     最常見的自動轉型:     定義方法時的引數為父類物件,而實際呼叫方法時傳參卻是子類引數。         public void 方法名(父類名  物件名){}         方法名(子類物件);     如上文提到的張老師的教學方法:             Teacher {             String name;             teach(Student un){un.study();    }         } (不同於強制型別轉換。構造了一個子類型別的物件,用一個父類型別的變數引用了,那麼,需要將這個物件的型別還原的時候,就可以用      子類名 子類物件=(子類)父類物件;)