class Super{
public int field = 0;
}
class Sub extends Super{
public int field = 1;
}
public class FieldAccess {
public static void main(String[] args) {
Super sup = new Sub();
System.out.println(sup.field);
}
这段代码运行结果为什么是0?
[code="java"]Super sup = new Sub();
System.out.println(sup.field); [/code]
虽然是实例化子类,但是子类可以继承/覆写父类的方法,却不能覆写父类的属性,虽然子类定义了和父类同名的属性,但是JVM认为那个属性只是子类特有的属性,所以这个地方得到0。
[color=darkred]Super sup [/color]= new Sub();
因为你声明的是Super,变量不会被覆盖(override),只是被隐藏(shadow)
想要多态的效果?方法才有多态,而实例变量是没有多态性的。
字段不会表现出多态,引用时什么类型的就调用什么类型的字段。
通俗易懂的说法就是,当向上转型时,会丢些(无权访问)属性和方法。
子类不能覆写父类的属性,你用Super 来声明 sup,只能会调用Super的field