当我准备接受有关OOP的采访时,我遇到了这个问题。
继承形式B. B继承自C. 将初始化A调用C?
的构造函数我所知道的是构造不是继承的。我们必须使用super关键字来引用父的构造函数。我是对的吗?
答案 0 :(得分:5)
子类的构造函数将首先调用其超类的构造函数。如果一个类有几个祖先,这些调用将被堆叠,直到调用顶级祖先的构造函数为止。然后,它将继续执行下一个祖先的构造函数,直到执行了祖先的所有构造函数。您可以从这里推断每次创建对象时,都会调用Object
类的构造函数,始终。
请注意,如果您未在子类构造函数中添加对super()
的调用,编译器将自动为您添加调用。如果超类没有默认构造函数,并且您没有在子类的构造函数中指定对超类的特定构造函数的调用,那么您将收到编译器错误。
所有这些规则都在JLS中说明。
答案 1 :(得分:2)
在Java世界中,当你扩展另一个课程时,你只能看到你的直接超级课程。构造函数。超类应该适当地封装超级超类构造函数。
答案 2 :(得分:1)
对基类的构造函数始终存在隐式调用。在您的情况下,将首先调用C
的构造函数,然后调用B
的构造函数,最后调用A
的构造函数。
当您定义了重载的构造函数并且想要调用特定的构造函数时,使用super
非常有用。