2012-03-10 64 views
0

所以我有延伸A.Java中使用了错误的类继承的方法

public class A 
{ 
    private int a = 1; 
    public int getA() 
    { 
    return a; 
    } 
} 

public class B extends A 
{ 
    private int a = 2; 
} 

然而,当B.getA()被调用父类,这里refered为A和B类,则返回1个来自A班而不是2个B班。我做错了什么?因为几个月前我遇到过类似的问题,并且在经过大量的混乱之后奇迹般地工作。唯一的区别是该方法处理向ArrayList添加对象。

谢谢。

回答

6

私有变量对于子类是私有的。 A.a和B.a是两个完全不同的领域。如果要更改子类中的数据,请将其设置为受保护的字段,或者(更好)将可选抽象的getter添加到父类并在子类中覆盖它。

+0

因此,继承的方法调用了Aa?所以我应该重写继承的方法来调用B.a,对吗? – 2012-03-11 01:59:02

+0

是的。那是对的。 (但是你不会“呼叫”'B.a' ...你会使用它,你只需要“呼叫”方法。) – 2012-03-11 02:37:53

+0

我正在谈论获取者。 – 2012-03-11 22:52:11

2

的原因是,在一个类中定义的字段是在子类中从未重写,字段访问修饰符不论

如果您在使用相同的名称作为超字段的子类声明的字段,你的子类实际上有与该名称的两个领域。从超类继承的字段在子类中是隐藏,但是(如果访问规则允许)可以在子类中访问超类版本;例如通过使用类名来限定字段名称。

(在你的具体的例子中,访问规则禁止B访问A宣布a一种private字段或方法只能从类访问本身或嵌套类。但即便如此,有两个领域在任何情况下B实例调用a。)