我有两个班级(A和B),B扩展A。
public class A {
protected int i = 1;
}
public class B extends A{
protected int i = 2;
}
在这种情况下,程序会写1。
A a = new B();
System.out.println(a.i); //1
但是如果我在构造函数中赋值i,它会写2。
public class B extends A{
public B(){
i=2;
}
}
A a = new B();
System.out.println(a.i); //2
为什么?
答案 0 :(得分:2)
在类中,与超类中的字段具有相同名称的字段会隐藏超类的字段,即使它们的类型不同。在子类中,超类中的字段不能通过其简单名称引用。相反,必须通过super访问该字段,这将在下一节中介绍。一般来说,我们不建议隐藏字段,因为它会使代码难以阅读。
字段不是多态的,您可以在A
对象上保留引用。通过执行i = 2
,您可以更改字段的值,从而修改结果。