关于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
相关产品推荐
相关产品推荐

