当子类定义与其超类中的成员变量同名的成员变量时,就会发生变量隐藏。与替换实现的函数覆盖不同,变量隐藏使用同名的新变量来掩盖超类变量。
考虑以下 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); aRef.identifyClass(); aRef = b; System.out.println(aRef.intVal); aRef.identifyClass(); } }
输出:
1 I am class A 1 I am class B
在此示例中,intVal 变量在 A 和B类。 B的成员变量对A隐藏了1,导致当aRef设置为b时,访问的intVal值仍然是1,也就是A的intVal的默认值。
访问隐藏变量对于超类,我们可以使用 super.var 或 ((SuperClass)this).var。例如:
aRef = b; System.out.println(aRef.intVal); // Outputs 1, the value of A's intVal System.out.println(((A)aRef).intVal); // Outputs 2, the value of B's intVal
通过显式地将 aRef 转换为其超类,我们可以访问隐藏的成员变量。
记住,变量隐藏允许子类定义自己的同名变量超类变量,但它不会完全覆盖它们。两个变量共存,子类变量隐藏超类变量。
以上是Java 中的变量隐藏与函数重写有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!