在探索 Java 中重写成员函数的概念时,您冒险尝试了重写成员变量。为此,您制作了以下类结构:
class A { public int intVal = 1; } class B extends A { public int intVal = 2; } class MainClass { public static void main(String[] args) { A a = new A(); B b = new B(); A aRef; aRef = a; System.out.println(aRef.intVal); aRef.identifyClass(); aRef = b; System.out.println(aRef.intVal); aRef.identifyClass(); } }
执行此代码产生以下输出:
1 I am class A 1 I am class B
您对为什么 aRef.intVal 即使在被执行后仍保持 1 表示困惑分配给 B 类的一个实例。要解开这个谜团,请理解在您呈现的场景中,您正在处理变量隐藏而不是重写。
在 Java 中,超类和子类中可以有同名的变量。这种变量隐藏技术有效地隐藏了超类变量。但是,这两个变量继续在各自的类中独立存在。
当您从超类的引用访问变量时,您正在与超类变量进行交互。引用本身不受它指向的对象的类的影响。因此,即使 aRef 指向类 B 的实例,它也会访问类 A 中的 intVal 变量,因为那是 aRef 所属的类。
要从子类 (B) 访问 intVal 变量,您需要可以使用 super 关键字,它引用超类。这种方法允许您区分超类和子类中具有相同名称的变量,从而解决任何歧义。
以上是为什么Java重写成员变量时会出现变量隐藏?的详细内容。更多信息请关注PHP中文网其他相关文章!