標籤:繼承 源碼 記憶體 class 對象
成員變數:
先看這樣一段代碼:
//父類。class Fu{int num = 3;}class Zi extends Fu{int num = 4;void show(){System.out.println("num = "+this.num);}}class ExtendsDemo {public static void main(String[] args) {Zi z = new Zi();z.show();}}從一張圖來看它的原理:
圖有點亂,看一下順序吧。在代碼中,super和this 的用法很相似,this代表的是本類對象的引用,super代表的是父類的記憶體空間。
成員函數:
【子父類中成員函數的特點】
特殊情況:子父類中的定義了一模一樣的函數。
啟動並執行結果:子類的函數在運行。
這種情況在子父類中,是函數的另一個特性:override(重寫,覆蓋,複寫)
重寫什麼時候用?舉例:
//描述手機。class Phone{int number;//打電話。void call(){}//來電顯示。void show(){sop("電話號碼.."+number);}}Phone p = new Phone();p.show();隨著電話的升級,只顯示號碼不爽,希望顯示姓名,照片。修改源碼,雖然費勁但是可以解決,不利於後期的維護和擴充。為了擴充方便。新功能是不是新的電話具備呢?單獨描述單獨封裝。新電話也是電話中的一種。繼承。直接擷取父類中的功能。但是新電話的來顯功能已經變化了。需要重新定義。那麼定義一個新功能合適嗎?比如newShow,不合適,因為父類已經將來顯功能定義完了,子類完全不需要重新定義新功能。直接用就可以了。如果子類的來顯功能內容不同。直需要保留來顯功能,定義子類的內容即可:這就是重寫的應用!class NewPhone extends Phone{String name;String picPath;//圖片路徑。void show(){//sop("電話號碼");super.show();//如果還需要父類中原有的部分功能,可以通過super調用。System.out.print("姓名"+name);System.out.print("照片"+picPath);}}【重寫(覆蓋)的注意事項】
1,子類覆蓋父類,必須保證全要大於或者等於父類的許可權。
Fu:
private void show(){}
Zi:
public void show(){}
2,靜態覆蓋靜態。
寫法上稍微注意:必須一模一樣:函數的返回值類型 函數名 參數列表都要一樣。
【總結】
當一個類是另一個類中的一種時,可以通過繼承,來擴充功能。
如果從父類具備的功能內容需要子類特殊定義時,使用重寫。
++【子父類中建構函式的特點】
當子父類都有建構函式時,發現結果為:
fu constructor run
zi constructor run
先執行了父類的建構函式,再執行子類的建構函式。
【這是為啥呢?】
因為子類的所有的建構函式中的第一行都有一句隱式語句 super(); //預設調用的是父類中的空參數的建構函式。
【子類中的建構函式為什麼有一句隱式的super()呢?】
原因:子類會繼承父類中的內容,所以子類在初始化時,必須先到父類中去執行父類的初始化動作。
才可以更方便的使用父類中的內容。
【小結】
當父類中沒有空參數建構函式時,子類的建構函式必須同構顯示的super語句指定要訪問的父類中的建構函式。
這就是傳說中的子類執行個體化過程。
【執行個體化過程的細節】
1,如果子類的建構函式第一行寫了this調用了本類其他建構函式,那麼super調用父類的語句就沒有了,因為this()或者super(),只能定義在建構函式的第一行,因為初始化動作要先執行。
2,父類建構函式中是否有隱式的super呢?
有。記住:只要是建構函式預設第一行都是super();
父類的父類是誰呢?super調用的到底是誰的建構函式呢?
Java體系在設計,定義了一個所有對象的父類Object ,
【總結】
類中的建構函式預設第一行都有隱式的super()語句,在訪問父類中的建構函式。
所以父類的建構函式既可以給自己的對象初始化,也可以給自己的子類對象初始化。
如果預設的隱式super語句沒有對應的建構函式,必須在建構函式中通過this或者super的形式明確調用的建構函式。
【問題】
1,this語句和super語句是否可以在同一個建構函式中出現呢?不行,因為必須定義在第一行。
2,為什麼要定義在第一行呢?因為初始化動作要先執行。
Java 繼承之子父類中的成員變數和函數