父類如果不寫無參構造方法,子類會報錯


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM