首页 >Java >java教程 >Java 子类可以重写成员变量,还是只是隐藏它们?

Java 子类可以重写成员变量,还是只是隐藏它们?

Patricia Arquette
Patricia Arquette原创
2024-12-19 22:15:09569浏览

Can Java Subclasses Override Member Variables, or Do They Just Hide Them?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn