一、子類中所有的構造方法默認都會訪問父類中無參的構造方法
因爲子類會繼承父類中的數據,可能還會使用父類的數據。所以子類初始化之前,一定要先完成父類數據的初始化。
其實子類的每一個構造方法的第一條語句默認都是:super()
/*
eg1.
程序測試結果:
Father的無參構造方法
Son的無參構造方法
*/
class Father {
int age;
public Father() {
System.out.println("Father的無參構造方法");
}
}
class Son extends Father {
public Son() {
//super();//隱含。其實子類的每一個構造方法的第一條語句默認都是:super()
System.out.println("Son的無參構造方法");
}
}
class ExtendsDemo{
public static void main(String[] args) {
//創建對象
Son s = new Son();
}
}
/*
eg2.
程序測試結果:
Father的無參構造方法
Son的無參構造方法
------------
Father的無參構造方法
Son的帶參構造方法
*/
class Father {
int age;
public Father() {
System.out.println("Father的無參構造方法");
}
public Father(String name) {
System.out.println("Father的帶參構造方法");
}
}
class Son extends Father {
public Son() {
//super()//子類中隱含
System.out.println("Son的無參構造方法");
}
public Son(String name) {
//super()//子類中隱含
System.out.println("Son的帶參構造方法");
}
}
class ExtendsDemo{
public static void main(String[] args) {
//創建對象
Son s = new Son();
System.out.println("------------");
Son s2 = new Son("林青霞");
}
}
二、如果父類沒有無參構造方法,那麼子類的構造方法會出現什麼現象?如何解決?
推薦,永遠手動給出無參構造。如果習慣好,就不會碰到這種問題。
如,以下code:只給了有參。把默認無參構造都覆蓋掉了,都起不了作用了。
現象:報錯。
//結果:報錯
class Father {
//只給了有參。把默認無參都覆蓋掉了。
public Father(String name) {
System.out.println("Father的帶參構造方法");
}
}
class Son extends Father {
public Son() {
System.out.println("Son的無參構造方法");
}
public Son(String name) {
System.out.println("Son的帶參構造方法");
}
}
class ExtendsDemo7 {
public static void main(String[] args) {
//Son s = new Son();
//System.out.println("----------------");
//Son ss = new Son("林青霞");
}
}
解決:
1)在父類中加一個無參構造。
2)使用super關鍵字。用super(…)帶參方法去顯示的調用父類的帶參構造方法。
3)子類通過this去調用本類的其他構造方法。
子類中一定要有一個去訪問了父類的構造方法,否則,父類的數據就沒有初始化。
注意:
this(…)或者super(…)方法必須出現在第一條語句上。
如果不是放在第一條語句上,就可能對父類的數據進行了多次初始化,所以必須放在第一條。
/*
採用super(...)解決
程序測試結果:
Father的帶參構造方法
Son的無參構造方法
------------
Father的帶參構造方法
Son的帶參構造方法
*/
class Father {
private String name;
//只給了有參。把無參都覆蓋掉了。
public Father(String name) {
System.out.println("Father的帶參構造方法");
}
}
class Son extends Father {
public Son() {
super("給一字符");//配合父類構造方法的參數情況
System.out.println("Son的無參構造方法");
}
public Son(String name) {
super(name);//配合父類構造方法的參數情況 正好這個Son方法傳進來了一個name參
System.out.println("Son的帶參構造方法");
}
}
class ConstructorTest {
public static void main(String[] args) {
Son s = new Son();
System.out.println("----------------");
Son ss = new Son("林青霞");
}
}