class FatherClass{
public FatherClass(){
System.out.println("父類 無參 構造函數(shù)");
}
public FatherClass(int i){
System.out.println("父類 一個參數(shù)構造函數(shù)super = "+i);
}
public FatherClass(int i,String j){
System.out.println("父類 一個參數(shù)構造函數(shù)superi = "+i+",superj = "+j);
}
}
class SonClass extends FatherClass{
public SonClass(){
// super(22);//line 1
System.out.println("子類 無參 構造函數(shù)");
}
public SonClass(int a){
super(33,"Hello");//line 2
System.out.println("子類一個參數(shù)構造函數(shù)sub = "+a);
}
public void fun(int a){//子類中定義一個實例函數(shù)
//super(33,"Hello");//構造函數(shù)調(diào)用必須聲明在構造函數(shù)中,這行代碼不注釋的話會報錯
System.out.println("子類一個參數(shù)構造函數(shù)sub = "+a);
}
}
public class ConstructorExtend {//測試子類繼承父類的構造函數(shù)
public static void main(String args[]){
// FatherClass fa = new FatherClass();
// FatherClass fa1 = new FatherClass(100);
// SonClass son = new SonClass();
SonClass son1 = new SonClass(200);
son1.fun(2);
}
}
子類 調(diào)用 父類的構造函數(shù):(構造函數(shù)不會被繼承琳拭,只是被子類調(diào)用而已)
1菠发、子類所有的 構造函數(shù) 默認調(diào)用父類的無參構造函數(shù)(其實是默認省略掉了一行代碼:super(););省略掉的這行super()代碼可以自行添加到構造函數(shù)的第一行(必須是第一行渔扎,否則報錯)
2盹舞、如果父類沒有定義構造函數(shù)像樊,系統(tǒng)會默認定義一個無參無返回值的構造函數(shù)眷唉,子類繼承時無需(無需的意思是:可以寫可以不寫)在子類構造函數(shù)中顯式調(diào)用super( )予颤;如果父類定義了有參構造函數(shù)囤官,此時子類的構造函數(shù)中第一行必須顯式調(diào)用父類定義的某個有參數(shù)構造函數(shù)。即蛤虐,顯式調(diào)用對應的參數(shù)個數(shù)党饮、對應參數(shù)類型與此super( [arg0][,arg1]…. )的父類構造函數(shù)。
3驳庭、如果子類的某個構造函數(shù) 想 調(diào)用父類的其他的帶參數(shù)的構造函數(shù)刑顺,在構造函數(shù)的第一行人為添加 super(val1,val2[,val3…]),super()括號中的變量數(shù)量由想調(diào)用的父類的構造函數(shù)中的變量數(shù)量決定。如代碼中的line 2饲常,調(diào)用的是父類構造函數(shù)中兩個參數(shù)的構造函數(shù)蹲堂,那么Super(20,”Hello”)就兩個變量。
4贝淤、自行添加super(val1,val2,…),就可以指定調(diào)用父類的那個參數(shù)類型和數(shù)量一致的構造函數(shù)柒竞。之后在此子類構造函數(shù)中,系統(tǒng)不會再默認調(diào)用父類無參構造函數(shù)播聪;
5朽基、如果子類的每個構造函數(shù)都自行添加super([val1,]….),除非人為調(diào)用父類無參構造函數(shù),否則的話父類的無參構造函數(shù)可以不寫离陶。有super指定調(diào)用的父類構造函數(shù)存在即可
6稼虎、super指代父類對象,可以在子類中使用 super.父類方法名(); 調(diào)用父類中的方法(無論是類方法還是實例方法都可以)招刨,此外調(diào)用實例方法還可以在方法內(nèi)部實例化再調(diào)用