class A {
A() { System.out.println("You call super class non-args constructor!"); } }
class B extends A {
B() { //這里,編譯器將自動加上 super();
System.out.println("You call subclass constructor!"); } B(String n) {
super();
this();
//實際就是調(diào)用了B(){...},而在B(){...}中編譯器自動加上了
//super();這樣就相當(dāng)于兩次調(diào)用了super();也就是說對父類進(jìn) //行了兩次初始化。而在實例化一個對象時,一個構(gòu)造方法只能調(diào)用一次,這說明this和super不能同時存在一個構(gòu)造方法中。
//同時因為系統(tǒng)沒有在第一行發(fā)現(xiàn)this()或super()調(diào)用,就會自動加上super(),如果沒有將this()和super()放在第一行就會產(chǎn)生矛盾。
//因為總有一個super()在第二句上。所以該程序不能通過編譯!??! }結(jié)論 也就是說你必須在構(gòu)造器的第一行放置super或者this構(gòu)造器,否則編譯器會自動地放一個空參數(shù)的super構(gòu)造器的,其他的構(gòu)造器也可以調(diào)用super或者this,調(diào)用成一個遞歸構(gòu)造鏈,最后的結(jié)果是父類的構(gòu)造器(可能有多級父類構(gòu)造器)始終在子類的構(gòu)造器之前執(zhí)行,遞歸的調(diào)用父類構(gòu)造器。無法執(zhí)行當(dāng)前的類的構(gòu)造器。也就不能實例化任何對象,這個類就成為一個無為類。 從另外一面說,子類是從父類繼承而來,繼承了父類的屬性和方法,如果在子類中先不完成父類的成員的初始化,則子類無法使用,應(yīng)為在java中不允許調(diào)用沒初始化的成員。在構(gòu)造器中是順序執(zhí)行的,也就是說必須在第一行進(jìn)行父類的初始化。而super能直接完成這個功能。This()通過調(diào)用本類中的其他構(gòu)造器也能完成這個功能。 因此,this()或者super()必須放在第一行。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供鳳城企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、成都做網(wǎng)站、html5、小程序制作等業(yè)務(wù)。10年已為鳳城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。