【问题标题】:Does an instance of superclass get created when we instantiate an object?当我们实例化一个对象时,是否会创建一个超类的实例?
【发布时间】:2012-02-18 19:44:08
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我一直认为(错误地)在创建子类的对象时会创建一个单独的子类和一个单独的超类对象。
    • 这也是它在 Python 或 C++ 中的工作方式(我相信,虽然我没有尝试过)。对吗?
    【解决方案2】:

    是的,这就是类继承的重点。

    但是,您并没有实例化两个对象:您正在实例化一个对象,并在其上同时运行 AClassBClass 构造函数。 AClass 构造函数负责初始化继承自AClass 的部分,BClass 构造函数负责初始化BClass 中定义的附加内容。

    【讨论】:

    • 我一直认为(错误地)在创建子类的对象时会创建一个单独的子类和一个单独的超类对象。
    【解决方案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 确实有这样的构造函数,所以如果 Object 是唯一的超类,没有问题。

    【讨论】:

    • +1 用于明确说明隐藏线“super( )”。当我开始使用 Java 编码时,这让我感到困惑。
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多