Java 中的变量隐藏
在探索 Java 中的成员函数重写时,对重写成员变量的可能性产生了好奇。要进行研究,请考虑以下代码:
public class A { public int intVal = 1; public void identifyClass() { System.out.println("I am class A"); } } public class B extends A { public int intVal = 2; public void identifyClass() { System.out.println("I am class B"); } } public 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); // Prints 1 aRef.identifyClass(); // Prints "I am class A" aRef = b; System.out.println(aRef.intVal); // Prints 1 aRef.identifyClass(); // Prints "I am class B" } }
输出为:
1 I am class A 1 I am class B
代码初始化两个类 A 和 B,它们都具有名为 intVal 的成员变量。 B 扩展 A 并重新声明 intVal 成员变量。当aRef引用变量设置为A的实例时,intVal成员变量被正确访问。但是,当 aRef 设置为 B 的实例时,intVal 成员变量仍然打印 A 类中存储的值。
为什么会出现这种情况?
成员变量隐藏
在这种情况下,B类中的成员变量intVal并没有覆盖A类。相反,该变量是隐藏。当变量被隐藏时,子类既包含超类的原始属性,又包含同名的新属性。
要访问超类的原始成员变量,可以使用 super.var 或 (( SuperClass)this).var 语法。例如:
// Access the original intVal member variable from the A class System.out.println(aRef.intVal); // Use super to access the original intVal member variable System.out.println(aRef.super.intVal);
需要注意的是,隐藏变量不需要是同一类型。它们只是在子类中共享相同的名称。这允许您为不同的子类创建相同属性的不同实现,从而提供灵活性和代码可重用性。
以上是Java 子类可以重写成员变量,还是只是隐藏它们?的详细内容。更多信息请关注PHP中文网其他相关文章!