this與super關鍵字在java中構造函數中的應用:
**java
**
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(); } }
執行這段代碼的結果爲:this
An Animal
A Dogspa
定義子類的一個對象時,會先調用子類的構造函數,而後在調用父類的構造函數,若是父類函數足夠多的話,會一直調用到最終的父類構造函數,函數調用時會使用棧空間,因此按照入棧的順序,最早進入的是子類的構造函數,而後纔是鄰近的父類構造函數,最後再棧頂的是最終的父類構造函數,構造函數執行是則按照從棧頂到棧底的順序依次執行,因此本例中的執行結果是先執行Animal的構造函數,而後再執行子類的構造函數。code
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的成員變量並給其賦值做爲子類的結果,此時在定義子類的構造函數時就須要調用父類的構造函數,並傳值,如上例所示。get
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()的區別主要有如下:
不一樣點:
一、super()主要是對父類構造函數的調用,this()是對重載構造函數的調用
二、super()主要是在繼承了父類的子類的構造函數中使用,是在不一樣類中的使用;this()主要是在同一類的不一樣構造函數中的使用
相同點:
一、super()和this()都必須在構造函數的第一行進行調用,不然就是錯誤的string