java中子類會繼承父類的構造方法嗎?
阿新 • • 發佈:2019-01-08
宣告:本人剛接觸java不久,如果理解的哪裡有錯誤或偏差,歡迎大家指正(希望大家帶著批判的眼光來看這篇文章)。
java中子類能繼承父類的構造方法嗎?帶著這個疑問我們首先來看個例子:
//B類繼承A類
public class B extends A {
public static void main(String[] args) {
B b = new B();
}
}
//建立A類
class A {
//A預設的構造方法
A() {
System.out.println("A類-->A()");
}
}
輸出結果:
由輸出結果可知,在第8行子類B例項化時,JVM呼叫了父類A的構造方法。那這是否能說明子類會繼承父類的構造方法呢?
再來看一個例子:
//B類繼承A類
public class B extends A {
//B帶參的構造方法
B(String name) {
System.out.println("B-->" + name);
}
public static void main(String[] args) {
B b = new B("good");
}
}
//建立A類
class A {
//A無參的構造方法
A() {
System.out.println("A類-->A()");
}
//A帶參的構造方法
A(String name) {
System.out.println("A-->" + name);
}
}
輸出結果為:
從輸出可以看出,子類B例項化時,JVM呼叫了父類A的無引數的構造器,而沒有呼叫A的有引數的構造器。如果子類會繼承父類的構造方法,那為什麼不執行另一個構造方法呢?
這是由於:
構造方法是一個類獨有的方法不會被它的子類繼承,但是子類在例項化物件時:如果子類的構造器沒有顯示的呼叫父類的構造器,則將自動呼叫父類預設的構造器(無參)。相當於預設省略了super()。
假如子類只有有參的構造方法時,又會如何呢 ?將上面A類的程式碼改為:
//建立A類
class A {
//A帶參的構造方法
A(String name) {
System.out.println("A-->" + name);
}
}
此時執行程式,編譯器將會報錯
那麼子類要使用父類帶引數的構造方法又要如何做呢?,看下面程式碼:
//B類繼承A類
public class B extends A {
//B帶參的構造方法
B(String name) {
super(name);
System.out.println("B-->" + name);
}
public static void main(String[] args) {
B b = new B("good");
}
}
//建立A類
class A {
//A帶參的構造方法
A(String name) {
System.out.println("A-->" + name);
}
}
輸出結果為:
子類如果想使用父類有參的構造方法,必須在子類的構造方法中使用super(引數)表示,而且super必須是子類構造方法中的頭一條語句。
總結一下吧:
- 子類例項化物件時,會先呼叫父類的構造器
- 如果子類的構造器沒有顯示的呼叫父類的構造器 ,預設呼叫super();
- 子類要使用父類有參的構造器,使用super(引數)形式,且super必須是子類構造方法中的頭一條語句。
- 如果父類沒有不帶引數的構造器,且子類的構造器中又沒顯示的呼叫父類其他構造器,則Java編譯器將報告錯誤。