- 子类中所有的构造方法默认都会访问父类中空参数的构造方法因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。子类每一个构造方法的第一条语句默认都是:super()
示例1:
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 ExtendsDemo6 {
public static void main(String[] args) {
//创建对象
Son s = new Son();
System.out.println("------------");
Son s2 = new Son("林青霞");
}
}
/*
输出结果为:
Father的无参构造方法
Son的无参构造方法
Father的无参构造方法
Son的带参构造方法
*/
- 如果父类没有无参构造方法,那么子类调用构造方法时会报错。
解决办法:
A:在父类中加一个无参构造方法
B:通过使用super关键字去显示的调用父类的带参构造方法
注:子类通过this去调用本类的其他构造方法,子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。this(…)或者super(…)必须出现在第一条语句上。如果不是放在第一条语句上,系统会自动添加,造成对父类成员变量的多次初始化。
class Father {
public Father(String name) {
System.out.println("Father的带参构造方法");
}
}
class Son extends Father {
public Son() {
super("随便给");
System.out.println("Son的无参构造方法");
}
public Son(String name) {
this();//通过this来调用本类的构造,以间接调用父类带参构造
System.out.println("Son的带参构造方法");
}
}
class ExtendsDemo7 {
public static void main(String[] args) {
Son s = new Son();
System.out.println("----------------");
Son ss = new Son("林青霞");
}
}
/*
输出结果:
Father的带参构造方法
Son的无参构造方法
----------------
Father的带参构造方法
Son的无参构造方法
Son的带参构造方法
*/