为什么我们不能覆盖java中的变量

时间:2013-02-06 05:50:43

标签: java

为什么我们不能覆盖java中的变量,它隐藏了变量

class A {
    int a = 4;
    public void test(){
        System.out.println("Test method of A" );
    }
} 

class B extends A {
    int a = 5;
    public void test(){
        System.out.println("Test method of B" );
    }
    public static void main(String s[]){
        A a= new B();
        System.out.println("Value of a : " a.a );
        System.out.println("Method result " a.test() );
    }
} 

输出::

Value of a : 4
Mthod result :Test method of B

当调用B的类测试方法但从超类引用访问变量

3 个答案:

答案 0 :(得分:4)

这就是java的工作方式。当代码有一个B但只有'知道'它有一个A时,B的方法将被调用但是A的变量将被访问(因为没有'方法覆盖变量的等价')。我建议你将变量包装在getter和setter中而不是暴露,这样你就可以通过覆盖getter和setter来控制它们在子类中的行为。

答案 1 :(得分:0)

如果要访问Parent类的变量,请使用
System.out.println( ((A)a).a );
键入将对象强制转换为其父对象,然后访问它

答案 2 :(得分:0)

假设您有一个接受A

类型参数的方法
void f(A a) {
     // do something with a.a
}

f方法的编写者编写了此方法,期望由A类定义的行为。并且您希望更改此行为。当您覆盖某个方法时,您可能会也可能不会更改该行为,您不应该这样做。您可以添加一些其他功能,但永远不会更改预期的行为,如果您可以覆盖变量,您肯定会更改行为。查看Open/ClosedLiskov Substitution Principles of Object Oriented Design