You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Java继承中abc、super.abc与DigitalDevice.abc的等价性疑问

问题解答:abc、super.abc与DigitalDevice.abc的区别

代码示例

父类 DigitalDevice

public class DigitalDevice {
    public int abc = 1;
}

子类 SmartPhone

public class SmartPhone extends DigitalDevice {

    SmartPhone() {
        abc = 2;
        super.abc=3;
        DigitalDevice.abc=4;
        
    }
}

问题描述

在SmartPhone类中,调用abc时可访问并修改DigitalDevice的abc;调用super.abc时同样可访问并修改DigitalDevice的abc;但调用DigitalDevice.abc时无法访问和修改,IDE报错要求将DigitalDevice中的abc设为static。请问在SmartPhone类中,abc、super.abc与DigitalDevice.abc是否等价?

核心结论:三者并不等价,本质是实例成员访问和类成员访问的区别

  • abc:访问的是当前SmartPhone实例继承自父类的实例成员。因为子类没有重定义同名的abc,所以直接写abc会指向父类继承来的这个实例变量,本质是操作当前对象的父类部分成员。
  • super.abc:明确指定访问父类DigitalDevice定义的实例成员。在子类未重定义abc的场景下,和abc的操作效果一致;但如果子类自己定义了同名的abc,super.abc会强制访问父类版本,而abc会访问子类自己的版本。
  • DigitalDevice.abc:这种写法是试图通过类名直接访问成员,Java中只有static(静态)成员才能通过类名直接调用。当前abc是实例成员,必须通过对象实例访问,所以IDE报错要求将其设为static。如果改成静态成员,它就属于类本身、所有实例共享,和前两种访问实例成员的方式完全不是一个概念。

内容的提问来源于stack exchange,提问作者Behnam R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:20:56