这个打印的结果是
B C 5
我 翻开笔记发现毕老师写过这么一句话:在多态中成员变量的特点:无论编译和运行都参考左边。
那么应该打印的是
B C 2
为什么呢? 作者: 苏克 时间: 2013-2-2 19:06
class Demo extends Super
{
int i=3;//加上这个就是打印2了,没有的话说明子类没有i只有父类有,相当于你继承过来的。
//也就是说其实只有一个i,所以打印肯定是I的最后结果。
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);
}
} 作者: 张庚 时间: 2013-2-2 19:51
class Super
{
int i=0;
public Super(String a)
{
System.out.println("A");
i=1;
}
class Demo extends Super
{
public Demo(String a) //2
{
super();//调用父类空的构造函数 1
System.out.println("C");
i=5; //最后i=5 结果就是 B C 5
}
public static void main(String[] args)
{
int i=4;
Super d=new Demo("A");
System.out.println(d.i);
}
}
你在子类Demo方法中并没有定义i
public Demo(String a)
{
System.out.println("C");
i=5;//这里的i是将继承父类的i值改为5
}
所以你的打印结果5其实是子类改变父类i后的值
如果此处改为int i = 5;
运行结果就是B C 2 了作者: 王昕 时间: 2013-2-3 00:32 本帖最后由 王昕 于 2013-2-3 00:47 编辑
构造函数执行的顺序:
Super d=new Demo("A");
这句调用了
public Demo(String a)
{
super(); //这句是编译器自动给你补上的,这时打印B,i=2
System.out.println("C");
i=5; //这时 i=5
}
那打印的当然是5。
实例变量能重新赋值,也就是说Super类有个 i ,他的所有子类的对象也一定都会有个 i ,能重新给这个 i 赋值。
你这个 i 本来就是Super的 i 被继承了又赋值了。