首页 > Java > java教程 > Java子类可以重写成员变量吗?

Java子类可以重写成员变量吗?

DDD
发布: 2024-12-18 18:15:10
原创
952 人浏览过

Can Java Subclasses Override Member Variables?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板