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); // Output: 1 aRef.identifyClass(); // Output: "I am class A" aRef = b; System.out.println(aRef.intVal); // Output: 1 aRef.identifyClass(); // Output: "I am class B" } }
该代码旨在演示重写成员变量的行为。然而,有一个难题 - 为什么 aRef 设置为 b(其 intVal 为 2)后 aRef.intVal 仍然返回 1?
答案在于变量隐藏的概念。当子类声明一个与其超类中的变量同名的变量时,它会“隐藏”超类的变量。这意味着子类有两个变量:一个来自其超类,一个来自其自己的定义。
在上面的代码中,intVal 成员变量在 A 和 B 中都声明了。因此,当创建 B 时,它有两个 intVals - 一个从 A 继承,值为 1,另一个在 B 中定义,值为 2。
当 aRef 设置为 a 时,它指的是A 的 intVal。当 aRef 设置为 b 时,它仍然引用 A 的 intVal。这是因为在表达式 aRef.intVal 中,aRef 解析为类型 A,而 intVal 是 A 的变量。
要访问 B 的 intVal,需要使用 ((B)aRef).intVal,它将 aRef 显式转换为 B 类型并允许访问 B 的变量。
以上是Java子类可以重写成员变量吗?的详细内容。更多信息请关注PHP中文网其他相关文章!