1. 程式人生 > >Java繼承中父類和子類建構函式的問題

Java繼承中父類和子類建構函式的問題

Java子類繼承父類在例項化時預設呼叫的是父類的無參建構函式,不論例項化時呼叫的是子類的有參還是無參建構函式,可以參考這篇Java子類例項化總是呼叫父類的無參構造方法
1、當父類沒有顯式定義構造方法時,編輯器會預設為此類新增一個隱式無參建構函式。此時子類可以有自己的無參和有參構造方法。
2、當父類有顯是定義無參構造方法時,此時子類也可以有自己的無參和有參構造方法。
3、當父類只有顯式定義有參構造方法時,此時子類定義無參方法會出錯:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor,即隱式父類建構函式Father()未定義, 必須顯式呼叫另一個建構函式,當此時呼叫父類的有參建構函式時,使用super(i),這裡i是引數,會提示i沒有定義,因為此時是無參建構函式;在子類的有參建構函式中使用super(i)呼叫父類的有參建構函式不會出錯。
分析:預設都是呼叫父類的無參建構函式,當父類有有參建構函式時,編輯器不會為父類新增無參的建構函式,在子類繼承父類時,本來是預設在建構函式第一行都是預設有使用super()呼叫父類無參建構函式的,現在父類沒有無參建構函式,因此提示顯示呼叫另一個建構函式(即有參建構函式)。
提醒一點,當沒有子類繼承父類時,父類只定義有參建構函式是沒有問題的。
4、當父類和子類都有無參和有參構造方法時,預設是子類構造方法都是呼叫父類的無參構造方法的,但當子類的有參構造方法使用super(i)呼叫父類的有參構造方法時,帶引數例項化時就不再呼叫父類的無參構造方法,而是呼叫父類的有參構造方法,因為是顯示呼叫(人為強制的)。
1的示例:

package classTest;

class Father1{

}
class Son1 extends Father1{
	public Son1() {
		System.out.println("子類的無參構造方法");
	}
	public Son1(int i) {

		System.out.println("子類中有參構造方法"+i);
	}
}
public class TestExtend {
public static void main(String[] args) {
	Son1 s = new Son1();
}
}

執行結果:

子類的無參構造方法

2中的示例:

package classTest;


class Father1{
	public Father1() {		
	}
}
class Son1 extends Father1{
	public Son1() {
		System.out.println("子類的無參構造方法");
	}
	public Son1(int i) {
		System.out.println("子類中有參構造方法"+i);
	}
}
public class TestExtend {
public static void main(String[] args) {
	Son1 s = new Son1();
}
}

執行結果:

子類的無參構造方法

3中的示例:

package classTest;


class Father1{

	  public Father1(int i) {
		System.out.println("父類中的有參構造方法"+i);
	}
}
class Son1 extends Father1{

	public Son1() {
		super(i);
		System.out.println("子類的無參構造方法");
	}
	public Son1(int i) {
         super(i);
		System.out.println("子類中有參構造方法"+i);
	}
}
public class TestExtend {
public static void main(String[] args) {
	Son1 s = new Son1();
}
}

結果:顯示引數沒有定義

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	i cannot be resolved to a variable

4中的例項:

package classTest;


class Father1{
    public Father1() {
	System.out.println("父類的無參構造方法");
}
	  public Father1(int i) {
		System.out.println("父類中的有參構造方法"+i);
	}
}
class Son1 extends Father1{

	public Son1() {
		System.out.println("子類的無參構造方法");
	}
	public Son1(int i) {
         super(i);
		System.out.println("子類中有參構造方法"+i);
	}
}
public class TestExtend {
public static void main(String[] args) {
	Son1 s = new Son1();
	System.out.println("-----");
	Son1 a = new Son1(5);
}
}

結果:

父類的無參構造方法
子類的無參構造方法
-----
父類中的有參構造方法5
子類中有參構造方法5