发布于2026-07-08 阅读(0)
扫一扫,手机访问
先纠正一个流传甚广的误解。有人说“super 可以访问父类被子类隐藏的成员变量和被重写的方法”,这句话前半段并不准确。事实上,super 在方法调用上确实能精准触发父类版本,但面对字段访问,它的表现并不如想象中那样“通达”。理解这个差异,需要对 Ja va 的变量隐藏(hiding)与方法重写(overriding)有清晰的认知,同时也得搞清楚 super 的真正作用边界。

在子类中,super 的典型用途相当明确:
super.methodName() —— 这会跳过子类的重写逻辑,直接执行父类的原始实现。super(...) —— 注意这必须是子类构造器的第一条语句。当子类定义了与父类同名的实例变量(或静态变量)时,发生的不是重写,而是变量隐藏(hiding)。这时:
super.varName 在编译期会被解析为父类中该变量的声明类型,但运行时呢?实例变量不具备多态性,所以 super.name 读取的其实是子类对象中该字段的值——也就是你定义的那个,而非父类的原始值。public String name = "Parent";,子类有 public String name = "Child";,那么 super.name 在子类中仍然返回 "Child"。因为字段绑定是静态的,子类对象内存中只有一份 name 字段(继承+覆盖),没有两份副本。protected String getParentName() { return name; },然后子类通过 super.getParentName() 调用。根因在于 JVM 的绑定机制:
super.method() 是一种显式指定调用父类版本的语法糖,JVM 直接定位到父类方法字节码。super,代表父类视角)决定字段符号,但运行时该字段属于当前对象内存布局的一部分——子类对象内存中只有一个 name 字段,没有独立副本。因此 super.name 和 this.name 指向同一块内存区域。别指望 super.field 来获取父类原始字段值。下面几个做法更可靠:
super.xxx() 复用。this.parentName = super.name;(前提是父类字段可访问)。parentConfig、baseTimeout)更清晰,也更容易维护。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8