咱們都知道若是初始化一個子類,必定會先初始化父類,即調用父類的構造方法,再調用子類的構造方法,可是若是父類有不少的構造方法,那麼調用哪個呢?看下面的例子: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中還得從新初始化,這顯然不符合情理、方法