为啥总是调用超类构造函数[重复]
Posted
技术标签:
【中文标题】为啥总是调用超类构造函数[重复]【英文标题】: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 标准命名约定,例如ClassA
和 ClassB
。以小写字符开头的名称表示变量。
"我假设只有classB
构造函数会被调用,因此唯一的输出是B
" 但是classB
的构造函数会打印A
...
@totymedli 感谢您指出这一点。我让他们换了
据我所知,在哺乳动物的世界中,祖先通常是在其后代之前构建的。可能 Java 原始设计者模仿了相同的行为。
@ThorbjørnRavnAndersen 它们通常也用于非构造方法。
【参考方案1】:
超类构造函数总是在构造过程中被调用,保证超类构造在子类构造函数被调用之前完成。大多数面向对象的语言都是这种情况。如果不想调用默认构造函数,可以显式调用带参数的超类构造函数;否则编译器会自动调用。
【讨论】:
【参考方案2】:这就是 Java 的工作原理。在调用子类的构造函数之前,调用父类的构造函数,一直到类层次结构通过Object
。
引用the docs:
使用
super()
,调用超类无参数构造函数。使用super(parameter list)
,调用具有匹配参数列表的超类构造函数。注意: 如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。
Object
确实有这样的构造函数,所以如果Object
是唯一的超类,那没有问题。如果子类构造函数显式或隐式调用其超类的构造函数,您可能会认为将调用整个构造函数链,一直到
Object
的构造函数。事实上,情况就是这样。它被称为构造函数链,当有很长的类下降时你需要注意它。
【讨论】:
【参考方案3】:就正在构造的对象而言,这两种语句没有区别,因此您会看到相同的输出。
在使用new
构造相同的对象时,仅在左侧使用不同的引用类型,就对象创建和构造函数链接而言,不会有任何区别。
你的两个语句之间有什么区别是在对象被创建之后。
【讨论】:
以上是关于为啥总是调用超类构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java 中的继承——创建子类的对象也会调用超类的构造函数。为啥?