1. 程式人生 > >java的無參構造器和super()

java的無參構造器和super()

1. 如果在類中你提供了其他有參的構造器,則編譯器不會提供預設的無參構造器。

class Animal {
	Animal(String name) { }
	public static void main(String[] args){
		Animal a = new Animal();
	}
}
該段程式碼編譯不會通過,報錯資訊如下:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
<span style="white-space:pre">	</span>The constructor Animal() is undefined

2. 如果在類中你沒有提供任何構造器,則編譯器會提供一個預設的無參構造器。

class Animal {
	public static void main(String[] args){
		Animal a = new Animal();
	}
}

該段程式碼則會順利編譯通過。

3. 如果你提供了一個構造器,你無須手動新增super()到你的構造器,編譯器會預設新增。

class Animal {
	Animal (){
		System.out.println("----Animal無參構造器-----");
	}
}
class Horse extends Animal {
	Horse() {
//		super(); //此行程式碼有與沒有都是一樣的
		System.out.println("----Horse無參構造器-----");
	}
	Horse(int a) {
//		super(); //此行程式碼有與沒有都是一樣的
		System.out.println("----Horse有參構造器-----");
	}
	public static void main(String[] args){
		Horse a = new Horse();
		Horse b = new Horse(3);
	}
}

列印資訊如下:
----Animal無參構造器-----
----Horse無參構造器-----
----Animal無參構造器-----
----Horse有參構造器-----

4. 如果父類未提供無參構造器,子類會報錯:
class Animal {
	Animal (int a){
		System.out.println("----Animal有參構造器-----");
	}
}
class Horse extends Animal {
	Horse() {
		System.out.println("----Horse無參構造器-----");
	}
	public static void main(String[] args){
		Horse a = new Horse();
	}
}

該程式碼不會編譯通過,報錯如下:
Implicit super constructor Animal() is undefined. Must explicitly invoke another constructor

5. 如果構造器中添加了this引用該類的其他構造器,或者添加了super()呼叫父類構造器,this和super必須在構造器第一行,this引用其他構造器和super()語句不會同時出現
class Animal {
	Animal (){
		System.out.println("----Animal無參構造器-----");
	}
}
class Horse extends Animal {
	String name;
	Horse() {
		System.out.println("----Horse無參構造器-----");
		this("馬");  //提示錯誤,
	}
	Horse(String name){
		this.name = name;
	}
}

具體錯誤提示為:Constructor call must be the first statement in a constructor

6. 如果構造器中添加了this引用該類的其他構造器,或者添加了super()呼叫父類構造器,如果this和super中有引數,則只能是靜態的方法和靜態變數或常量

class Animal {
	Animal (){
		System.out.println("----Animal無參構造器-----");
	}
}
class Horse extends Animal {
	String name;
	Horse() {
		this(getRondomName());<span style="font-family:Arial, Helvetica, sans-serif;"> //程式碼段A</span>
		System.out.println("----Horse無參構造器-----");
	}
	Horse(String name){
		System.out.println("----Horse有參構造器-----"); //程式碼段B
		this.name = name;
	}
	static String getRondomName(){
		int x = (int) (Math.random() * 5);
		String name = new String[] {"馬", "豬", "牛", "羊","貓"}[x];
		return name;
	}
	public static void main(String[] args){
		Horse a = new Horse();
	}
}

列印結果如下:
----Animal無參構造器-----
----Horse有參構造器-----
----Horse無參構造器-----

如果呼叫了this引用其他構造器,那麼super()將不會在該構造器中呼叫,所以super()將在程式碼段B前面一行被呼叫,而不是在程式碼段A前面一行。

如果把getRondomName方法前的static去掉,則會提示錯誤:Cannot refer to an instance method while explicitly invoking a constructor