我在一篇问题论文中看到了这个问题:
为什么派生类构造函数总是访问基类构造函数?
我想知道问题是否有效?
答案 0 :(得分:4)
在开始搞乱派生对象中的继承功能之前,你可能有一个类型为“Base”的有效对象!
答案 1 :(得分:3)
无效。它没有'应该':它 必须 ,并且编译器通过调用基类的默认构造函数(如果它存在)强制执行它,并且如果它存在则给出编译错误没有,这迫使你调用现有的一个构造函数。
答案 2 :(得分:2)
总是有一个例外,超类中的默认构造函数通常不会被称为显式。
如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。
答案 3 :(得分:1)
因为基类可能会起作用,所以你不知道。
答案 4 :(得分:1)
因为基类可能包含需要初始化的成员。
答案 5 :(得分:1)
由于派生类构造函数想要从基类构造函数继承,因此必须调用基类构造函数。否则,如果不这样做,则不会继承在基类构造函数中初始化的值。
答案 6 :(得分:1)
调用超类构造函数不是必须,而 应与强建议配对 - 只要超类具有默认构造函数。否则,编译器会强制您至少调用其中一个超类构造函数。
如果存在默认构造函数,则无论如何都会调用它,即使子类construtor中没有显式的super()语句也是如此。
类构造的可见部分是字段的初始化。但还有更多内幕(内存分配,注册等)。在创建派生类时,必须为所有超类完成所有这些操作。