2019獨角獸企業重金招聘Python工程師標準>>>
this與super關鍵字在java中構造函數中的應用:?
**
super()函數
**?
super()函數在子類構造函數中調用父類的構造函數時使用,而且必須要在構造函數的第一行,例如:
class Animal {public Animal() {System.out.println("An Animal");}
}
class Dog extends Animal {public Dog() {super();System.out.println("A Dog");//super();錯誤的,因為super()方法必須在構造函數的第一行//如果子類構造函數中沒有寫super()函數,編譯器會自動幫我們添加一個無參數的super()}
}
class Test{public static void main(String [] args){Dog dog = new Dog();}
}
執行這段代碼的結果為:
An Animal?
A Dog
定義子類的一個對象時,會先調用子類的構造函數,然后在調用父類的構造函數,如果父類函數足夠多的話,會一直調用到最終的父類構造函數,函數調用時會使用棧空間,所以按照入棧的順序,最先進入的是子類的構造函數,然后才是鄰近的父類構造函數,最后再棧頂的是最終的父類構造函數,構造函數執行是則按照從棧頂到棧底的順序依次執行,所以本例中的執行結果是先執行Animal的構造函數,然后再執行子類的構造函數。
class Animal {private String name;public String getName(){name = name;}public Animal(String name) {this.name = name;}
}
class Dog extends Animal {public Dog() {super(name);}
}
class Test{public static void main(String [] args){Dog dog = new Dog("jack");System.out.println(dog.getName());}
}
運行結果:
jack
當父類構造函數有參數時,如果要獲取父類的private的成員變量并給其賦值作為子類的結果,此時在定義子類的構造函數時就需要調用父類的構造函數,并傳值,如上例所示。
this()函數
this()函數主要應用于同一類中從某個構造函數調用另一個重載版的構造函數。this()只能用在構造函數中,并且也只能在第一行。所以在同一個構造函數中this()和super()不能同時出現。?
例如下面的這個例子:
class Mini extends Car {Color color;//無參數函數以默認的顏色調用真正的構造函數public Mini() {this(color.Red);}//真正的構造函數public Mini(Color c){super("mini");color = c;}//不能同時調用super()和this(),因為他們只能選擇一個public Mini(int size) {super(size);this(color.Red);
}
`所以綜上所述,super()與this()的區別主要有以下:?
不同點:?
1、super()主要是對父類構造函數的調用,this()是對重載構造函數的調用?
2、super()主要是在繼承了父類的子類的構造函數中使用,是在不同類中的使用;this()主要是在同一類的不同構造函數中的使用?
相同點:?
1、super()和this()都必須在構造函數的第一行進行調用,否則就是錯誤的