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

时间:2012-01-25 16:03:55

标签: java inheritance constructor

当我们在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

那么,是否意味着在实例化类时会创建超类对象的完整层次结构?

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

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是唯一的超类,则没有问题。

答案 2 :(得分:2)

是的,这就是阶级继承的重点。

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