一、子类中所有的构造方法默认都会访问父类中无参的构造方法
因为子类会继承父类中的数据,可能还会使用父类的数据。所以子类初始化之前,一定要先完成父类数据的初始化。
其实子类的每一个构造方法的第一条语句默认都是: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("林青霞");
}
}