詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用
在Java中創(chuàng)建一個(gè)類的對(duì)象時(shí),如果該類存在父類,則先調(diào)用父類的構(gòu)造方法,然后再調(diào)用子類的構(gòu)造方法。如果父類沒(méi)有定義構(gòu)造方法,則調(diào)用編譯器自動(dòng)創(chuàng)建的不帶參數(shù)的默認(rèn)構(gòu)造方法。如果父類定義了public的無(wú)參的構(gòu)造方法,則在調(diào)用子類的構(gòu)造方法前會(huì)自動(dòng)先調(diào)用該無(wú)參的構(gòu)造方法。如果父類只有有參的構(gòu)造方法,沒(méi)有無(wú)參的構(gòu)造方法,則子類必須在構(gòu)造方法中必須顯式調(diào)用super(參數(shù)列表)來(lái)指定某個(gè)有參的構(gòu)造方法。如果父類定義有無(wú)參的構(gòu)造方法,但無(wú)參的構(gòu)造方法聲明為private,則子類同樣必須在構(gòu)造方法中必須顯式調(diào)用super(參數(shù)列表)來(lái)指定某個(gè)有參的構(gòu)造方法。如果父類沒(méi)有其他的有參構(gòu)造方法,則子類無(wú)法創(chuàng)建。
有父類 | 子類 | ||
---|---|---|---|
Public無(wú)參構(gòu)造方法 | Private無(wú)參構(gòu)造方法 | 有參構(gòu)造方法 | |
無(wú) | 無(wú) | 無(wú) | 所有構(gòu)造方法都會(huì)調(diào)用父類的默認(rèn)構(gòu)造方法 |
有 | 無(wú) | 無(wú) | 所有構(gòu)造方法都會(huì)調(diào)用定義的無(wú)參構(gòu)造方法 |
無(wú) | 無(wú) | 有 | 所有構(gòu)造方法都必須指定調(diào)用某個(gè)有參的構(gòu)造方法,或通過(guò)this調(diào)用某個(gè)其他的構(gòu)造方法。 |
有 | 無(wú) | 有 | 可以指定調(diào)用某個(gè)構(gòu)造方法,如果沒(méi)有指定,則調(diào)用無(wú)參構(gòu)造方法。 |
無(wú) | 有 | 無(wú) | 子類無(wú)法構(gòu)造(父類無(wú)法派生子類) |
無(wú) | 有 | 有 | 所有構(gòu)造方法都必須指定調(diào)用某個(gè)有參的構(gòu)造方法,或通過(guò)this調(diào)用某個(gè)其他的構(gòu)造方法。 |
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Parent { private String pString; Parent(){ pString = "p1" ; } } class Child extends Parent { private String cString; Child() { cString = "c1" ; } } |
當(dāng)Child對(duì)象創(chuàng)建時(shí),會(huì)先調(diào)用父類Parent的構(gòu)造方法將pString初始化為”p1”,然后再調(diào)用Child的構(gòu)造方法,將cString初始化為”c1”。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Parent { private String pString; private Parent(){ pString = "p1" ; } Parent(String s){ pString = "p2" ; } } class Child extends Parent { private String cString; Child() { super ( "" ); cString = "c1" ; } } |
由于父類定義了private的無(wú)參構(gòu)造方法,因此,在子類中必須顯式指定調(diào)用某個(gè)有參的構(gòu)造方法。
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
原文鏈接:http://blog.csdn.net/ccpat/article/details/44459697