下面这段程序执行的结果为什么是" B C 7",而不是"C 5 " ,求解释,谢谢。
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);
}
}
在执行new Demo("A")创建一个子类对象时,调用了Demo的带参数的构造方法,由于Demo继承了Super(也就继承了super中的i),所以,在 System.out.println("C");之前其实是隐藏了一句super();它会自动调用父类的不带参数的构造函数,所以会先输出B,并且i+2,然后再输出C。既然Demo继承了Super中的i,那么,Demo中i+=5,此时自然就变成7了。Super d=new Demo("A"),这句是父类的引用指向子类的对象,但在执行d.i时,会调用子类中的i,然后再输出,就是7.
其实在这个程序里还有一点很重要:Super d=new Demo();Super s=new Super();Demo d=new Demo();这些都可以。但不可以创建子类的引用指向父类的对象。 |