为什么我们不能覆盖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的类测试方法但从超类引用访问变量
时答案 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/Closed和Liskov Substitution Principles of Object Oriented Design