java中继承类的对象在堆内存中只占用一个连续对象空间,子类实例包含父类字段与自身字段的完整布局,通过对象头+父类字段+子类字段
的顺序排列实现“is-a”关系。
在Java中,继承不意味着创建多个独立对象,而是通过单一内存块实现类型扩展。以如下代码为例:
public class A {
private int id;
public A(int id) { this.id = id; }
}
public class B extends A {
private String name;
public B(int id, String name) {
super(id);
this.name = name;
}
}当执行 B b = new B(1, "b"); 时,JVM在堆(Heap)中仅分配一个对象实例,其内存布局为:
✅ 这种扁平化、连续的字段布局是Java单继承语义的底层支撑:B实例的起始地址(即对象头地址)可直接被A类型引用安全使用——因为从该地址开始的内存区域,前部恰好符合A类的字段结构。这也是为什么 A aRef = new B(1, "b"); 合法且无需额外转换。
⚠️ 注意事项:
总结:Java继承的本质是字段组合而非对象组合。理解这一内存模型,有助于深入掌握多态实现原理、序列化行为、以及Unsafe类字段偏移计算等高级主题。