1. 程式人生 > >JAVA-初步認識-第九章-繼承-子父類中的構造函數-子類的實例化過程

JAVA-初步認識-第九章-繼承-子父類中的構造函數-子類的實例化過程

pri 系統 color col 分享 log 添加 就會 sys

一.

子父類中構造函數的特點。

舉例演示一下,

技術分享

技術分享

類中不寫構造函數,它裏面也是有的。只是寫出來,可以看的更清楚一些。

DOS結果顯示比較特別,在有Zi run的情況下,還有Fu run的存在。按道理說,子類創建的對象,應該就是子類的內容,這裏突然出現一個父類的內容。而且裏面運算的時候,只涉及對象的初始化。

現在討論為什麽子類創建對象構造函數初始化時,會有父類的構造函數也有初始化,而且位於子類之前。

技術分享

由上面截圖引發的思考,什麽時候super()會出現?之前談論的this,是為了區分本類和對象中重名的東西,super出現的原因是什麽?
技術分享

真實的情況如下,Zi()構造函數中,存在super();語句,可以對比之前的this(),this()是指用this關鍵字加個括號來代表本類中的構造函數。相同的,用super關鍵字用來調用父類中的函數,super和this關鍵字很相似。

技術分享

正確的流程敘述一遍:main中先進行new zi(),在堆中開辟空間,分配地址值,默認初始化沒有東西(因為沒有成員變量)。接著進行構造初始化,就訪問到Zi()了,這個Zi()進入內存後,裏面就開始執行了。子類構造函數中有三句,super();System.out.println("zi run");和return;(return被影藏了)。→super();是隱式的,不寫也存在。在這樣的繼承子類構造函數中,super是一定存在的(?)。return什麽時候隱藏,或者應該在什麽地方存在

有super()的存在,就指向了父類,Fu()構造函數就進棧了,因此就先輸出Fun run這句話。然後再輸出zi run,和運行return。

這裏為什麽super調用的是空參數構造函數?原因在於,萬一父類中沒有書寫構造函數,那麽它就是默認的構造函數,它就是一個空參數列表的函數。(解釋挺奇怪的)

誰說父類構造函數裏面一定是空參,裏面添加了其他東西。DOS結果顯示出錯。子類有super();默認就是有空參的構造函數,這時父類中沒有空參構造函數,就會失敗。

技術分享

技術分享

這時候又引出,誰說定義類的時候,一定要寫空參的構造函數?想寫什麽參數就寫什麽參數,想怎麽構造初始化,就怎麽構造初始化。這可以用super直接指定。那就意味著,在有參數列表的構造函數時,空參數的構造函數就不存在了

技術分享

構造函數覆蓋不?

為什麽沒有覆蓋?子類中的構造函數和父類中的構造函數能相同麽?不可能。

註意:子父類中構造函數不能不在。

就繼承而言,子類可以父類的很多的東西,但是父類的構造函數是繼承不了的。只能通過super()來調用父類的構造函數,這個就叫做子類的實例化過程。

子類的實例化就是創建對象。

技術分享

這就是它的初始化過程。對於類的建立也需要初始化麽?

現在又對子類中的構造函數進行了擴展,類中不止一個構造函數。這符合實際情況,不可能類中只有一個默認的構造函數。

技術分享

技術分享

技術分享

結果是什麽呢?DOS顯示的結果為A,D。這裏是在強調實例化的存在。一定要註意影藏語句的存在,在實際的開發中很多是沒有書寫super()的。

還有一點要強調的是,如果父類中沒有空參數構造函數(沒有話,需要自己自定義一個空參數構造函數),子類的實例化過程就進行不下去,DOS就會報錯。

空參數構造函數和默認構造函數。如果沒有自定義空參數構造函數,那會不會有系統默認的構造函數存在,從而子類的實例化過程可以繼續運行。

A

技術分享

技術分享

本例說明什麽?當父類中定義了具有參數列表的構造參數時,空參數構造函數就不存在了。導致子類實例化的過程出錯。

B

技術分享

技術分享

父類構造函數為空參數列表,和裏面的執行語句不符合。

C

技術分享

技術分享

D

技術分享

本例說明父類在沒有定義構造函數時,是存在一個空參數的默認構造函數的。

註意:子類的實例化過程是否一定要進行

JAVA-初步認識-第九章-繼承-子父類中的構造函數-子類的實例化過程