Java super关键字用法详解:访问父类成员与调用父类方法
在Java面向对象编程中,super 关键字主要用于引用当前对象的父类引用。它常被用于解决子类与父类同名成员的访问冲突,以及明确调用父类的构造函数或方法。本文将通过具体代码实例与内存模型分析,展示 super 的实际应用场景。
super 关键字的核心功能
super 是 Java 提供的保留字,代表对当前对象父类部分的引用。它在以下三种场景中发挥关键作用:
- 调用父类构造器:必须在子类构造器的第一行使用(例如
super()),且不可与this()共存。 - 访问被子类隐藏的变量:当子类定义与父类同名的成员变量时,直接使用变量名将访问子类的属性,此时需使用
super.变量名强制访问父类的属性。 - 调用父类被重写的方法:在子类重写了父类方法后,若需在子类方法逻辑中保留或复用父类的原始行为,可使用
super.方法名()进行调用。
第1步:构建具有继承关系的父子类结构
为了验证上述用法,我们设计一个包含属性与方法复写的简单场景。父类 FatherClass 持有整型 value,而子类 ChildClass 不仅继承了父类,还定义了自己的 value 并重写了 f() 方法。
class FatherClass {
public int value;
public void f() {
value = 100;
System.out.println("FatherClass.value:" + value);
}
}
class ChildClass extends FatherClass {
private int value;
public void f() {
// 核心动作:先执行父类的f()逻辑
super.f();
// 随后修改并输出子类自身的value
value = 200;
System.out.println("ChildClass.value:" + value);
System.out.println(value); // 此处直接打印,默认指代子类变量
System.out.println(super.value); // 显式使用super,指向父类变量
}
}
public class TestInHerit {
public static void main(String args[]) {
ChildClass cc = new ChildClass();
cc.f();
}
}
第2步:观察控制台的执行结果
运行上述 TestInHerit 程序,控制台依次输出以下内容:
从输出中可以清晰地观察到两个维度的差异:
1. 第一行输出了 100,这是由 super.f() 触发的父类逻辑,其中父类的 value 被赋值为 100。
2. 后续输出的 200 则是子类局部作用域下的 value。这表明在同一个作用域块内,如果直接写 value,编译器优先匹配到的是子类自身定义的字段。
第3步:分析对象在内存中的布局分布
为了更好地理解为什么会出现这种“隔离”现象,我们需要查看堆内存中对象的实际构成:
当 new ChildClass() 被创建时,生成的对象并非仅仅包含子类独有的属性,而是包含了完整的层次结构。ChildClass 对象的内存布局实际上是由两部分叠加而成的:
- 上半部分包含从 FatherClass 继承而来的公共/私有成员变量和方法区链接;
- 下半部分追加 ChildClass 自己声明的特有成员。
这种物理上的合并存储方式,正是 super 能够准确定位到父类数据区域的底层基础。
以上就是对Java中super关键字用法与实际应用原理的详细内容,更多关于Java继承机制与对象模型的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









