1. 程式人生 > >java中子類會繼承父類的構造方法嗎?

java中子類會繼承父類的構造方法嗎?

宣告:本人剛接觸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編譯器將報告錯誤。