当我准备一个关于OOP的面试时,我遇到了这个问题。
A继承了B, B继承了C。初始化A会调用C的构造函数吗?
我所知道的是构造对象不能被继承。我们必须使用super关键字来引用父类的构造函数。我说的对吗?
子类的构造函数将首先调用其超类的构造函数。如果一个类有多个祖先,这些调用将被堆叠,直到调用最高祖先的构造函数。然后,它将继续执行下一个祖先的构造函数,直到执行所有祖先的构造函数。从这里可以推断,每次创建对象时,都会调用Object
类的构造函数,总是。
请注意,如果您没有在子类构造函数中添加对super()
的调用,编译器将自动为您添加它。如果没有父类的默认构造函数,并且没有在子类的构造函数中指定对父类的特定构造函数的调用,则会得到编译错误。
所有这些规则都在JLS中说明。
在Java世界中,当您扩展另一个类时,您只能看到您的直接超类的构造函数。超类应该正确封装超-超类构造函数。
总是会有一个隐式的调用基类的构造函数。在您的示例中,首先调用C
的构造函数,然后调用B
的构造函数,最后调用A
的构造函数。
使用super
是有用的,当你已经定义了重载的构造函数,你想调用一个特定的。