多态调用同名成员变量,为何访问的是父类的成员变量?

发布于 2022-09-05 00:16:10 字数 678 浏览 17 评论 0

刚开始猜测,由于父类和子类的成员变量在堆中各存一份,可能是父类的存在上面,因此先找到的父类的成员变量。然后测试了一下,代码如下:

package test;

public class Polymorphism {
    public static void main(String[] args) {
        F f = new Z();
        f.show();
        System.out.println("f:"+f);
        System.out.println("f:"+f.a);
    }
}

abstract class F{
    int a = 10;
    public abstract void show();
}
class Z extends F{
    int a = 5;
    public void show(){
        System.out.println("Z:"+this);
        System.out.println("Z:"+this.a);
    }
}

输出为:
Z:test.Z@15db9742
Z:5
f:test.Z@15db9742
f:10

f与this指向同一个对象访问同一个变量结果却不同,所以我上边的猜测应该是错的。那究竟是什么原因导致多态调用同名成员变量,访问的是父类的成员变量这种情况?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

断肠人 2022-09-12 00:16:10

图片描述

f指的是子类对象。只听过方法的重写和重载,没有类变量的重写和重载吧,我运行的程序,它分情况了,如果是调用方法,就是实际所指的对象(这里实际对象是子类对象Z)的方法,如果是类变量同名了,就是生命对象的类变量值。

动次打次papapa 2022-09-12 00:16:10

java中方法的重写,重载与动态链接构成多态,多态就是同一个事物的不同表现形式。

你这个例子是方法的重写表现出来的多态性。

声明的是父类F,实际上指向他的子类Z,这个时候是相当于一个向上类型转换,因为Z也是由F继承过来的,所以可以向上转型,现在Z是F类型的。

所以这里f变量由Z实例化出来的,但是它是F类型的,表现出来的是F的特性。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文