1

为什么我们不能覆盖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 的类测试方法被调用,但变量是从超类引用中访问的

4

3 回答 3

4

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

于 2013-02-06T05:55:32.483 回答
0

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

于 2013-02-06T06:00:55.213 回答
0

假设您有一个接受 A 类型参数的方法

void f(A a) {
     // do something with a.a
}

f方法的作者已经编写了这个方法,期望类 A 定义的行为。并且您想要更改此行为。当你重写一个方法时,你可能会也可能不会改变行为,你不应该这样做。您可以添加一些其他功能,但永远不要改变预期的行为,如果您可以覆盖变量,您肯定会改变行为。检查面向对象设计的开/闭Liskov 替换原则

于 2013-02-06T06:14:04.427 回答