1.成員變量的繼承
1.1要點
子類用extends關鍵字繼承父類。子類中可以提供新的方法覆蓋父類中的方法。子類中的方法不能直接訪問父類中的私有域,子類可以用super關鍵字調用父類中的方法。在子類中可以增加域,增加方法或者覆蓋超類的方法,然而絕對不能刪除繼承的任何域和方法。
在一個子類被創建的時候,首先會在內存中創建一個父類對象,然後在父類對象外部放上子類獨有的屬性,兩者合起來形成一個子類的對象。所以所謂的繼承使子類擁有父類所有的屬性和方法其實可以這樣理解,子類對象確實擁有父類對象中所有的屬性和方法,但是父類對象中的私有屬性和方法,子類是無法訪問到的,只是擁有,但不能使用。就像有些東西你可能擁有,但是你並不能使用。所以子類對象是絕對大於父類對象的,所謂的子類對象只能繼承父類非私有的屬性及方法的說法是錯誤的。可以繼承,只是無法訪問到而已。
但是,子類不能繼承父類的構造方法。 在子類的構造方法中可以通過 super 關鍵字調用父類構造方法。注意:該語句必須是子類構造方法的第一條語句。子類中的構造方法一定要調用父類的構造方法,否則編譯出錯。
1.2成員變量的繼承
(1)關於私有成員變量
無論父類中的成員變量是私有的、共有的、還是其它類型的,子類都會擁有父類中的這些成員變量。但是父類中的私有成員變量,無法在子類中直接訪問,必須通過從父類中繼承得到的protected、public方法(如getter、setter方法)來訪問。
例如:
1 public class Father { 2 private String name; 3 private int age; 4 public String getName(){ 5 return name; 6 } 7 public int age(){ 8 return age; 9 } 10 11 } 12 public class Child extends Father{ 13 public String getName(){ 14 return super.getName(); //通過這種方式訪問父類私有數據 15 } 16 }
(2)關於靜態成員變量
無論父類中的成員變量是靜態的、還是非靜態的,子類都會擁有父類中的這些成員變量。
(3)關於被子類覆蓋的成員變量
無論父類中的成員變量是否被子類覆蓋,子類都會擁有父類中的這些成員變量。
2.方法重載與重寫的區別
(1)方法的重寫Overriding和重載Overloading是Java多態性的不同表現。
(2)重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。
(3)重載:方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同也可以不相同
(4)重寫:相同的方法名、返回類型和參數表。 注意:子類函數的訪問修飾權限不能少於父類的
3.多態與動態綁定
3.1父類型變量引用子類型對象
例:Father father = new Child();
(1)父類類型的引用可以調用父類中定義的所有屬性和方法,不能調用子類中定義而父類中沒有的方法。
(2)父類中定義的方法:
如果子類中沒有重寫,則調用父類中定義的方法;
如果子類中重寫了該方法,那麼父類類型的引用將會調用子類中的這個方法,這就是動態連接
3.2多態總結:
(1)使用父類類型的引用指向子類的對象;
(2)該引用只能調用父類中定義的方法和變量;
(3)如果子類中重寫了父類中的一個方法,那麼在調用這個方法的時候,將會調用子類中的這個方法;(動態連接、動態調用)
(4)變量不能被重寫(覆蓋),“重寫”的概念只針對方法,如果在子類中”重寫“了父類中的變量,那麼在編譯時會報錯。