在实例化对象时是否创建了超类的实例?

当我们在java中实例化一个特定的类时,是否会创建一个超类实例。 如果是这种情况那么实例化所有超类将会有很多开销。 我试过以下代码:

public class AClass { public AClass() { System.out.println("Constructor A"); } } public class BClass extends AClass{ public BClass(){ System.out.println("Constructor B"); } } public class Test { public static void main(String[] args) { BClass b = new BClass(); } } 

代码的输出是:

 Constructor A Constructor B 

那么,这是否意味着当我们实例化一个类时,会创建超类对象的完整层次结构?

创建单个对象 – 但该对象超类和子类(以及java.lang.Object本身)的实例。 没有三个单独的对象。 有一个对象有一组字段(基本上是在层次结构中上下声明的所有字段的并集)和一个对象标题。

构造函数一直在inheritance层次结构中执行 – 但是对于所有这些构造函数, this引用都是相同的; 它们都有助于单个对象的初始化。

是。

BClass构造函数如下所示:

 public BClass () { super (); // hidden line, added by compiler System.out.println("Constructor B"); } 

如果您不想使用默认构造函数,可以这样做:

 public BClass () { super (parameters); // now you will use different constructor from AClass // compiler will not add here call to "super ()" System.out.println("Constructor B"); } 

从oracle站点:如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。 如果超类没有无参数构造函数,则会出现编译时错误。 对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。

是的,这是类inheritance的重点。

但是,您没有实例化两个对象:您正在实例化一个对象,并在其上运行AClassBClass构造函数。 AClass构造函数负责初始化从AClassinheritance的部分,而BClass构造函数负责初始化BClass定义的其他内容。