错误。super可用于访问被子类隐藏的父类实例变量和被重写的方法,这是Java语法明确规定的核心功能;字段隐藏时super.field能访问父类声明的同名字段值(非多态),方法重写时super.method()可精准调用父类版本。

super 关键字不能用于访问父类中被子类**隐藏的成员变量**,也不能直接“精准调用被重写的方法”——它调用的是父类版本的方法,这是设计本意,而非“绕过重写”。关键在于理解 Java 中变量隐藏(hiding)与方法重写(overriding)的本质区别,以及 super 的实际作用边界。
super 能做什么:安全调用父类方法和构造器
在子类中,super 主要用于:
- 调用父类被重写(overridden)的实例方法:super.methodName() —— 这会跳过子类的重写逻辑,执行父类原始实现;
- 调用父类构造器:super(...) —— 必须是子类构造器的第一条语句;
- 访问父类中被子类同名变量遮蔽(shadowed)但未隐藏的字段(仅限于内部类或局部作用域场景,非常少见)。
super 不能做什么:无法访问被隐藏(hiding)的静态/实例变量
当子类定义了与父类同名的静态变量或实例变量时,会发生变量隐藏(hiding),而非重写。此时:
- super.varName 在编译期会被解析为父类中该变量的声明类型,但运行时仍受对象实际类型影响 —— 对实例变量而言,super.varName 实际读取的是子类对象中该字段的值(因为字段不具多态性);
- 更关键的是:super 无法突破字段绑定的静态性。例如父类有 public String name = "Parent";,子类有 public String name = "Child";,那么 super.name 在子类中仍指向子类对象的 name 字段(值为 "Child"),并非父类原始值;
- 若想真正获取父类字段原始值,必须在父类中提供受保护的 getter 方法(如 protected String getParentName() { return name; }),再通过 super.getParentName() 调用。
方法重写 vs 变量隐藏:为什么 super 对两者行为不同?
根本原因在于 JVM 的绑定机制:
- 方法调用默认是动态绑定(virtual call),super.method() 是一种显式指定调用父类版本的语法糖,JVM 会直接定位到父类方法字节码;
- 字段访问是静态绑定(early binding),编译器根据引用类型(这里是 super,代表父类视角)决定字段符号,但运行时该字段属于当前对象内存布局的一部分 —— 子类对象内存中只有一个 name 字段(继承+覆盖),没有两份副本,所以 super.name 和 this.name 指向同一块内存。
实用建议:如何真正“精准获取”父类状态?
不要依赖 super.field 获取父类原始字段值。正确做法是:
- 将父类字段设为 private,并提供 protected 或包级访问的 getter 方法;
- 在子类中需要父类原始逻辑时,优先重写方法并在其中用 super.xxx() 复用;
- 若必须保留父类字段快照,可在子类构造器中显式保存:this.parentName = super.name;(前提是父类字段可访问);
- 避免同名字段隐藏 —— 使用不同名称或组合模式(如 parentConfig、baseTimeout)更清晰可靠。










