[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(); } } (不同於強制型別轉換。構造了一個子類型別的物件,用一個父類型別的變數引用了,那麼,需要將這個物件的型別還原的時候,就可以用 子類名 子類物件=(子類)父類物件;)