当前位置: 首页 > 知识库问答 >
问题:

为什么超类构造函数总是叫[duplicate]

籍光熙
2023-03-14

我有以下2个类

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

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

然后运行

classA c = new classB();

classB c = new classB(); 

始终给予

A
B

为什么会出现这种情况?乍一看,在这两种场景中,我都假设只调用classB构造函数,因此唯一的输出是

B

但这显然是错误的。

共有2个答案

梁丘赞
2023-03-14

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

堵龙野
2023-03-14

这就是Java的工作原理。在调用子类的构造函数之前,先调用父类的构造函数,然后通过object沿类层次结构向上移动。

从文件中引用:

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

注意:如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,您将得到一个编译时错误。object确实有这样的构造函数,所以如果object是唯一的超类,就没有问题。

如果子类构造函数显式或隐式地调用其超类的构造函数,您可能会认为会有一整条构造函数链被调用,一直到object的构造函数。事实上,情况正是如此。它被称为构造函数链接,当有一长串类下降时,您需要意识到它。

 类似资料:
  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 我目前正在学习Java的继承,我在理解它方面遇到了很大的困难,但是我不能理解的一个主要问题是为什么在下面的示例中有必要调用一个超类构造函数,它有什么帮助?此示例来自Oracle的方法教程。 我最初的想法是,会缩短当前构造函数中参数的代码,它只会接受父类中传入的值并将其添加到子类中(如下所示): 但是,正如我已经知道的那样,这是错误的,并且再次将我带到了真正做什么的问题上。我会非常感谢一些形式的解释

  • 在C#中,当我创建一个空类时,它提供了一个默认的构造函数,但是当我提供一个带有参数的构造函数时,默认的构造函数不再被创建。 我的问题是: 为什么编译器不再给我默认的构造函数呢 这些问题来自于WCF,我需要默认构造函数,但也希望能够为构造函数提供值,并且不必每次都放置默认构造函数,而且我不认为未使用的默认构造函数会使很多开销。

  • 问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,

  • 本文向大家介绍请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?相关面试题,主要包含被问及请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA构造函数 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一

  • 问题内容: 我有两个类,和,扩展了前一个类。 具有以下构造函数: 我将注意到所有实例变量都已设置为private。 同时,具有以下构造函数: 但是,这为我的构造函数引发了“找不到符号”错误。 我尝试使用,但是我的超类的私有范围阻止了这种情况。 我发现向我的构造函数中添加字段并允许我调用超级构造函数,但是我想知道是否存在一种无需在子类构造函数中传递其所有参数的情况下调用超级构造函数的方法? 问题答案