繼承裡面構造器的呼叫,程式怎麼執行,詳解3

2021-09-02 13:09:37 字數 1434 閱讀 1930

這次是第三篇寫關於繼承的東西了,之前本人我感覺把程式怎麼跑的搞懂了,就感覺自己繼承學的差不多了,就感覺自己繼承可以拿出手了,直到碰到這個坑,才感覺自己其實差的太多了,自己還需要不斷的差缺補漏,繼承的世界很豐富。

如果看過這篇的文章學了點知識,感覺繼承還不是特別清楚,我是建議大家再去看下我之前那兩篇關於繼承的文章,我個人覺得那對於想搞清楚程式是怎麼執行的人還是有幫助的。

下面給出本篇文章的內容父類

publicclassperson

person(intb)

} 子類

publicclassstudentextendsperson

student(intb)

publicstaticvoidmain(string args)

} 可以先不看執行結果,自己先琢磨一下。

執行結果:

父類的的無參構造方法

父類的有參構造器 0

父類的有參構造方法中的a:20

我是父類有參構造方法下面的

10<>20

10這裡要講的是關於繼承的乙個坑,在子類中student st1 =newstudent(c) new

了乙個子類物件,那麼系統會預設呼叫父類的無參構造器的,這裡需要說明一下對父類的構造器的呼叫是怎麼回事:如果在子類中沒有用

super

顯示呼叫父類的那個構造器,那麼不管是子類的哪個構造器,都會預設的去呼叫父類的無參構造器的。

這裡之所以執行父類的有參構造器是因為在子類的構造器裡面

new了乙個父類的物件(

person p =newperson(b);

),呼叫了父類的有參構造器。也輸出了

a的值確實為

20,那麼現在問題來了,最後為什麼就成了10

呢?其實我程式的測試結果或許已經給大家很多提示了。程式確實是跑到了父類的有參構造方法,

a的值也確實被賦值成了

20,但是我們要知道程式為什麼會跑到父類的構造器裡面?,是因為

new了乙個父類物件是吧,那麼這個物件就有了自己的屬性

a,它被賦值是

20,那麼最後為什麼又了

10 了呢?我看看程式的最後的輸出是輸出誰?那是輸出子類物件的屬性

a的值,說到這裡想必大家都恍然大悟吧。這裡的坑主要是搞懂那兩個

a的值是兩個不同物件的不同屬性值,是互不干擾的。那個

10是子類物件屬性

a的值,

20是父類物件屬性

a的值。

在繼承中構造器的呼叫順序

一.在繼承中構造器的呼叫順序 1.呼叫基礎類構造器。按著繼承順序,首先得到最底層的基礎類 根節點 然後是下乙個衍生類,直到最後的衍生類 葉子節點 2.按宣告順序低啊用成員初始化模組。3.呼叫衍生類構造器的主體。二.如下面的例子 class testa class testb class testc ...

Java構造方法的繼承呼叫

1.對於父類含有引數建構函式的方法,子類可以通過在自己構造方法中使用super關鍵字來呼叫,但是super必須是第乙個可執行語句 2.父類無參建構函式一定被呼叫 class father public father int x public void sub 1 public class son e...

繼承與建構函式的呼叫

class a public virtual void printfields class b a public override void printfields y x,y 當使用new b 建立b的例項時,產生什麼輸出?分析 輸出x 1,y 0 因為構造b之前,先執行變數,y沒有明確賦值,預設...