繼承環境下的構造方法調用

咱們都知道若是初始化一個子類,必定會先初始化父類,即調用父類的構造方法,再調用子類的構造方法,可是若是父類有不少的構造方法,那麼調用哪個呢?看下面的例子:code

package io;

public class ConstructorTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        B b = new B(100);
        //B b = new B();
    }

}

class A {
    public A() {
        System.out.println("A no params");
    }

    public A(int i) {
        System.out.println("A has params");
    }
}

class B extends A{
    public B(){
        System.out.println("B no param");
    }
    public B(int i) {
        System.out.println("B has params");
    }
}

output:ci

A no params
B has params

能夠看到調用了父類的默認構造方法,爲了驗證若是將A的無參數的構造方法註釋掉,則new B的時候會報錯,it

class A {
    /*public A() {
        System.out.println("A no params");
    }
*/
    public A(int i) {
        System.out.println("A has params");
    }
}
Implicit super constructor A() is undefined. Must explicitly invoke another constructor

而若是這時候將A的兩個構造方法都註釋掉,卻又不報錯了:io

class A {
    /*public A() {
        System.out.println("A no params");
    }
*/
    /*public A(int i) {
        System.out.println("A has params");
    }*/
}

這是由於若是A中沒有構造方法,那麼會默認給它建立一個無參數的構造方法。而若是有其它的構造方法了,就不會給它建立了。
因此說子類默認調用的是父類的無參數的構造方法,或者當父類確實沒有無參數的構造方法時,還能夠經過super來調用它的其它構造方法:class

class A {
    /*public A() {
        System.out.println("A no params");
    }
*/
    public A(int i) {
        System.out.println("A has params");
    }
}

class B extends A{
    public B(){
        super(21);
        System.out.println("B no param");
    }
    public B(int i) {
        super(i);
        System.out.println("B has params");
    }
}

注意:若是要顯式的調用super,那麼必須把它放在第一位。若是不放在第一位,那麼super以前的初始化語句等因而沒有執行,由於在super中還得從新初始化,這顯然不符合情理、方法

相關文章
相關標籤/搜索