1. 程式人生 > >Constructor call must be the first statement in a constructor

Constructor call must be the first statement in a constructor

nag mic tracking student cte 共存 sys 類繼承 進行

技術分享

super()和this ()不能共存。否則編譯時會報異常。

Constructorcall must be the first statement in a constructor

換句話說就是super()和this()都必須在構造方法的第一行。

this(有參數/無參數) 用於調用本類對應的構造函數

super(有參數/無參數) 用於調用父類對應的構造函數

並且在構造函數中,調用必須寫在構造函數定義的第一行,不能在構造函數的後面使用。

一個構造函數定義中不能同一時候包含this調用和super調用,假設想同一時候包含的話,能夠在this()調用的那個構造函數中首先進行super()調用。也能夠把TestB()這種方法改動成非構造方法。在構造方法TestB(int i)中調用。

正確解釋:The parent class‘ constructor needs to becalled before the subclass‘ constructor. This will ensure that if you call anymethods on the parent class in your constructor, the parent class has alreadybeen set up correctly.

翻譯:之前父類的構造函數須要調用子類的構造函數。

這將確保假設你調用不論什麽方法在父類構造函數,父類已經被正確設置。


2.錯誤:Implicit super constructor xx() is undefined for default constructor. Must define an explicit constructor


由於你的父類已經定義了一個有參的構造函數,此時編譯器不會為你調用默認的構造函數。
當子類繼承時,必須在自己的構造函數顯式調用父類的構造函數。自己才幹確保子類在初始化前父類會被實例化,
假設你父類中有無參的構造函數,子類就不會強制要求調用。即你寫的那個就能夠通過,
編譯器會默認幫你調用父類的構造函數。
按原來的思路,必須該成以下的:

class Person { 
	protected String name; 
	protected int age; 
	//你已經定義了自己主動的構造函數,此時編譯器不會為你創建默認的構造函數 
	public Person(String name,int age) { 
		this.name=name; 
		this.age=age; 
	} 
	public void print() { 
		System.out.println("Name:"+name+"/nAge:"+age); 
	}
} 
/*由於父類的構造函數是有參的,所以編譯不會為你自己主動調用默認的構造函數。此時。子類在自己的構造函數中必須顯式的調用父類的構造函數 */
class Student extends Person { 
	public Student(){      //子類構造函數 
	//super();   不行,由於你的父類沒有無參的構造函數 
	
	super("a",1); 
      //顯示調用父類的構造函數。並且必須是第一行調用 
	} 
} 
	class Test { 
		public static void main(String args[]){ 
		} 
}



Constructor call must be the first statement in a constructor