所以我有一个父类,这里称为A,而B类则扩展为A。
public class A
{
private int a = 1;
public int getA()
{
return a;
}
}
public class B extends A
{
private int a = 2;
}
然而,当调用B.getA()时,它从A类返回1而不是B类中的2。我做错了吗?因为几个月前我遇到了类似的问题,并且在经历了很多混乱后奇迹般地工作了。唯一的区别是该方法处理将对象添加到ArrayList。
感谢。
答案 0 :(得分:6)
私有变量甚至是子类的私有变量。 A.a和B.a是两个完全不同的领域。如果要更改子类中的数据,请将其设置为受保护的字段,或者(更好的是)将可选的抽象getter添加到父类并在子类中覆盖它。
答案 1 :(得分:2)
原因是类中定义的字段在子类中从不覆盖,无论字段的访问修饰符。
如果在子类中声明一个与超类中的字段同名的字段,则子类实际上有两个具有该名称的字段。从超类继承的字段在子类中是 hidden ,但是(如果访问规则允许),可以在子类中访问超类版本;例如通过使用类名限定字段名称。
(在您的特定示例中,访问规则禁止 B
访问a
中声明的A
。private
字段或方法只能从类本身或嵌套类访问。但即便如此, 在任何a
实例实例中都有两个名为B
的字段。)