【问题标题】:Why is super class constructor always called [duplicate]为什么总是调用超类构造函数[重复]
【发布时间】:2016-04-02 00:07:56
【问题描述】:

我有以下两门课

public class classA {
    classA() {
        System.out.println("A");
    }
}

class classB extends classA {
    classB() {
        System.out.println("B");
    }
}

然后运行

1

classA c = new classB();

2

classB c = new classB(); 

总是给予

A
B

为什么会这样?乍一看,在任何一种情况下,我都会假设只有 classB 构造函数会被调用,因此唯一的输出是

B

但这显然是错误的。

【问题讨论】:

  • 请注意,对于类,您应该使用 Java 标准命名约定,例如 ClassAClassB。以小写字符开头的名称表示变量。
  • "我假设只有classB 构造函数会被调用,因此唯一的输出是B" 但是classB 的构造函数会打印A...
  • @totymedli 感谢您指出这一点。我让他们换了
  • 据我所知,在哺乳动物的世界中,祖先通常是在其后代之前构建的。可能 Java 原始设计者模仿了相同的行为。
  • @ThorbjørnRavnAndersen 它们通常也用于非构造方法。

标签: java inheritance superclass default-constructor


【解决方案1】:

超类构造函数总是在构造过程中被调用,保证超类构造在子类构造函数被调用之前完成。大多数面向对象的语言都是这种情况。如果不想调用默认构造函数,可以显式调用带参数的超类构造函数;否则编译器会自动调用。

【讨论】:

    【解决方案2】:

    这就是 Java 的工作原理。在调用子类的构造函数之前,调用父类的构造函数,一直到类层次结构通过Object

    引用the docs:

    使用super(),调用超类无参数构造函数。使用super(parameter list),调用具有匹配参数列表的超类构造函数。

    注意: 如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。 Object 确实有这样的构造函数,所以如果 Object 是唯一的超类,那没有问题。

    如果子类构造函数显式或隐式调用其超类的构造函数,您可能会认为将调用整个构造函数链,一直到Object 的构造函数。事实上,情况就是这样。它被称为构造函数链,当有很长的类下降时你需要注意它。

    【讨论】:

      【解决方案3】:

      就正在构造的对象而言,这两种语句没有区别,因此您会看到相同的输出。

      在使用new 构造相同的对象时,仅在左侧使用不同的引用类型,就对象创建和构造函数链接而言,不会有任何区别。

      你的两个语句之间有什么区别是在对象被创建之后。

      【讨论】:

        猜你喜欢
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 1970-01-01
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多