2013-02-06 71 views
1

为什么我们不能覆盖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

'class B extends B' ...什么? – Makoto

+0

对不起其延伸的 – varsha

+0

已经解释[这里] [1]和[这里] [2] 问候 [1]:http://stackoverflow.com/questions/427756/overriding-a-超级实例变量 [2]:http://stackoverflow.com/questions/8983002/how-are-the-variables-overridden-in-java – ultraklon

回答

4

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

+0

是的。我想知道java在这种情况下的行为 – varsha

0

如果您要访问父类的变量,然后使用
System.out.println(((A)a).a);
类型转换对象到其父,然后访问它

+0

我想你误解了这个问题。我建议再读一遍。 –

0

假设你有一个不接受A型

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

f方法的作者已经编写了此方法,期望由A类定义的行为。并且您想要更改此行为。当你重写一个方法时,你可能会也可能不会改变这个行为,而你不应该这样做。你可以添加一些其他功能,但不会改变预期的行为,如果你可以覆盖一个变量,你肯定会改变行为。检查Open/ClosedLiskov SubstitutionPrinciples of Object Oriented Design

相关问题