Java的繼承時父類與子類的構造方法的呼叫次序問題

2021-08-19 16:15:47 字數 1503 閱讀 9051

可以先思考一下,該會輸出什麼?

正確輸出答案:

people(string name)

child(string name)

解析:1.帶引數生成的物件固然要去找帶有對應引數的構造方法,在child類中進入了帶有string引數的構造方法,由於有super(name)的語句存在;2.因此去找父類中帶有string引數的構造方法,輸出people(string name);3回到子類中執行輸出child(string name)。

2.注釋了super(name)的情況

正確輸出結果:

people()

child(string name)

解析:1.帶引數生成的物件固然要去找帶有對應引數的構造方法,在child類中進入了帶有string引數的構造方法,由於沒有super帶引數的方法,但是會預設有super()的方法的存在;2.因此就會去找父類的無參的構造方法輸出people();3.返回到子類中輸出child(string name)。

總結:子類的構造過程中一定會呼叫父類的構造方法,如果沒有使用super方法帶參的宣告(該帶參方法必須在構造方法的第一行,否則會報錯),被呼叫的任意乙個的子類構造方法都會預設執行super()方法,呼叫父類的無參構造方法;如果使用了super的帶參宣告,則會執行相對應的父類中的構造方法,而父類中的無參構造不在會被呼叫。

下面來個思考題的拓展一下:

正確輸出結果:

child_playfootball:null

child_playbasketball:null

child_playfootball:jerry

child_playbasketball:jerry

解析:1.物件的生成去找child()無參構造;2.由於繼承關係預設去找父類的無參構造方法;3.然後載入父類中私有變數name;4.又進入people的構造方法,找到了playbasketball()方法;5.此時又回到子類中尋找是否有此類方法,找到了該同名方法,輸出時由於child類中未載入本類中的私有變數name,所以輸出只能時null;6.和步驟5一樣;7.處理完了父類,回到child類中,載入了本類中的私有變數,正常輸出。

如果將上面的兩類中的方法中的public改為private ,正確輸出

people_playfootball:tom

people_playbasketball:tom

child_playfootball:jerry

child_playbasketball:jerry

論private的重要性,要養成良好的**習慣很重要,要時常保持本類中分變數或者方法處於private狀態。

java 子類與父類

1.父類 注 f m1 是父類不被繼承的方法 f m2 父類被子類重寫的方法 public class father public void f m1 public void f m2 2.子類 注 f m3是子類的私有方法 f m2 子類重寫父類方法 public class sunextends...

C 繼承中的父類與子類的構造與析構

子類繼承父類後,當建立子類物件,也會呼叫父類的建構函式 問題 父類和子類的構造和析構順序是誰先誰後?class base base class son public base son void test01 intmain 執行結果 總結 繼承中 先呼叫父類建構函式,再呼叫子類建構函式,析構順序與構...

Java 子類繼承父類呼叫順序

建立子類後的呼叫順序 構造器呼叫順序 多型this.method o super.method o this.method super o super.method super o 注意 如果某個方法是靜態的,那麼這個方法就不具有多型性。class a a public void fun publi...