我已经研究了一些关于这个主题的相关帖子,我了解到当我们在子类中创建一个同名的变量时,这就是所谓的隐藏。
class A {
int i = 10;
public void printValue() {
System.out.print("Value-A");
System.out.println(i);
}
}
class B extends A {
int i = 12;
public void printValue() {
System.out.print("Value-B");
System.out.println(i);
}
}
public class Test {
public static void main(String args[]) {
A a = new B();
a.printValue();
System.out.print(a.i);
}
}
当我使用class B
实例化type A
并打印成员数据
A a=new B();
System.out.println(a.i)//The output is `10`.(The value of parent class member data).
但是当我将class B
实例化为type B
时,
B a=new B();
System.out.println(a.i)//The output is 12. (The value of parent class member data)
我想知道它们有何不同。
答案 0 :(得分:2)
变量绑定到引用,而不绑定到创建的对象。在您的示例中,A a = new B();
此处a
是对A
类型绑定的变量的引用。并且,创建的对象是类型B
,绑定方法。这就是它为参考变量选择值的原因。这称为数据隐藏。因为当我们在子类中创建相同的变量时,子类的变量值隐藏在super
类变量下。希望它有所帮助。
答案 1 :(得分:1)
多态性仅适用于方法。变量仍然与该类型绑定。你不能改变变量。这就是您在更改类型时看到不同输出的原因。
简单来说,当你写
时 A a=new B();
请记住,变量绑定到左侧,方法从右侧执行。