class Zi extends Fu
{
int i=10;
public Zi()
{
i=i+3;
}
public static void main(String[] args)
{
Fu a=new Zi();
System.out.println(a.i);
Zi b=new Zi();
System.out.println(b.i);
}
}
输出为2
13
b.i=13能理解
问题是:a.i为何等于2
Fu a=new Zi();
不就是传说中的上转型嘛,把子类对象赋给父类引用,在调用输出对象的成员变量或静态函数时看=左边,调用非静态成员函数时看=右边。所以第一句调用的a.i是调用父类的成员变量。因为创建对象时调用构造函数i++变成了由1变成了2,所以会输出2.
Fu a=new Zi();在执行时创建了父类的对象a,没有给a分配对空间,new Zi();分配了对空间,a指向了该堆空间。调用函数时执行的是堆空间里的函数,调用变量和静态函数时是Fu类对象的成员。具体原因我记不清了。