题目如下:写出程序运行结果
class Super
{
int i=0;
public Super(String a)
{
System.out.println("A");
i=1;
}
public Super()
{
System.out.println("B");
i+=2;
}
}
class Demo extends Super
{
public Demo(String a)
{
System.out.println("C");
i+=5;
}
public static void main(String[] args)
{
int i=4;
Super d=new Demo("A");
System.out.println(d.i);
}
}
运行结果:B C 7
解析:Super d=new Demo("A");时,会调用demo的有参构造函数,而构造函数第一行有个super()【隐式的,下面会解释】,于是就到父类中,此时i为0,执行父类的无参构造函数
public Super()
{
System.out.println("B");
i+=2;
}
,此时打印B且i为2;执行完之后再回到demo的构造函数
public Demo(String a)
{
System.out.println("C");
i+=5;
}
继续执行,打印C此时i为7.
那么为什么在demo构造函数第一行会有隐式的super函数呢?
是这样的,1.当父类中有个空参数的构造函数时候,子类所有的构成函数里第一行默认都有一句supr():调用父类的空参数构成函数;所以子类初始化时候,要先访问下父类构造函数,如果要访问父类指定的构造函数,可以手动定义super语句,子类中至少有个构造函数会访问父类构造函数;
2.当父类中没空参数的构造函数时候,而是有参数的父类构造函数。这时super()不能隐式。则必须自己在子类的构成函数里第一行默认添加super(参数)