子類是由繼承得到的類,被繼承的類就是父類,子類與父類是"is-a"關系。
一、子類與父類
1. 子類
(1)子類定義
class 子類名 extends 父類名 {...}
(2)子類繼承性
子類繼承了父類的所有屬性和除了構造方法的其余方法。
- 子類與父類在同個包中:子類繼承父類除了private成員
- 子類與父類在不同包中:子類繼承父類除了private、友好成員
- protected成員:若子類與祖先類同包,子類可訪問
2. 父類
所有類的祖先類是Object類(java.lang.Object)。
3. 子類與父類
父類可有0或多個子類,子類只能有一個父類。
obj instanceof Class; // 若obj是Class的子類, 返回True, 否則返回False
public class Person extends Object {…} public class Student extends Person {…} public class Graduate extends Person {…} /* ------------------------------------------- */ public void method1(Person e) { if (e instanceof Person) { // 處理Person類及其子類對象 } if (e instanceof Student) { //處理Student類及其子類對象 } if (e instanceof Graduate) { //處理Graduate類及其子類對象 } }
二、子類
1. 隱藏屬性
當子類中新聲明的變量與父類的成員變量同名時,子類中繼承的變量被隱藏,若想使用,可通過繼承的方法調用。
2. 隱藏方法——方法重寫
當子類中新聲明的方法與父類的方法同名時,為方法重寫,表示實現與父類不同的行為,但方法名相同。
方法重寫時,方法名、返回值類型、參數列表都必須相同,訪問權限可升不可降,並且重寫的方法不能操作隱藏的成員。
三、子類與子類對象
子類對象的用法與普通類的對象相同。
子類對象不能操作隱藏的成員,可通過繼承的方法訪問。
四、父類與子類對象
1. 上轉型對象
由父類People擴展的子類Chinese,將子類創建的對象Lina的引用值賦給父類創建的對象person,person即為對象的上轉型對象。
class People {...} class Chinese extends People {...} class E { public static void main(String args[]) { Chinese Lina = new Chinese(); People person = Lina; // People person = new Chinese(); // 以上兩句類似此句 } }
在上面代碼的基礎上,以下一語句是錯誤的。因為可以說Chinses類是People類,但不能說People類是Chinses類(如老虎是動物[✔],動物是老虎[✘])。
Chinese Lisa = new People(); // 此句錯誤
2. 上轉型對象的規則
(1)上轉型對象不存在子類新增的變量或方法,只有繼承的、隱藏的變量和繼承的、重寫的方法。
(2)若子類重寫了方法,則上轉型對象調用的是重寫的方法。
(3)當子類重寫的方法是靜態方法時,上轉型對象調用的是父類的靜態方法。
(4)可將上轉型對象強制轉化為子類對象,此時該對象具備子類新增的屬性和行為。
五、對象類型轉換
- 從子類到父類的類型轉換可以自動進行。
- 從父類到子類的類型轉換必須通過強制類型轉換實現。
- 無繼承關系的引用類型間的轉換是非法的。
- 在轉換前可使用instanceof操作符測試對象的類型。
