我一直在使用Eclipse Juno学习继承中的构造函数。
当我在childClass中按两次ctrl + O时,它会显示继承的成员。 但我碰巧在继承的成员中看到了超类的构造函数
但据说构造函数不是继承的......
有人可以解释一下这种行为吗?
答案 0 :(得分:7)
与字段,方法和嵌套类不同,构造函数不是类成员。
子类从其超类继承所有成员(字段,方法和嵌套类)。构造函数不是成员,因此它们不是由子类继承的,但是可以从子类调用超类的构造函数。
答案 1 :(得分:4)
只会继承成员,并且不会将构造函数视为成员。
要理解为什么构造函数不是继承的,请考虑OOP中的继承是允许对象处理的机制的一部分,更一般的对象。这要求继承所有数据成员和所有方法。
不要做的继承是允许一个对象实例化,方式与另一个,更通用的对象相同。
这是因为构造函数必须将对象初始化为有效状态,并且为超类对象初始化有效状态的足够信息可能不足以初始化有效信息子类对象的状态!
要解决此问题,如果构造函数是继承的,当您从库中扩展类时,您必须手动选择退出不希望继承的构造函数。这很麻烦且容易出错,因为当该库的新版本在该基类中出现更多构造函数时,您自己的类现在会受到无效初始化(通过泄漏的构造函数),除非您也发布了更新。或者可能是在您自己的超类中添加构造函数会“破坏”您自己的子类,您必须转到每个子类并选择退出新的子类。换句话说,代码的有效性将与您使用的基础更紧密地耦合。
另一方面,“选择加入”,通过显式定义自己的构造函数并将它们与基类的构造函数链接起来,实际上更有意义,并且对组件的有效性更安全。这个选择是由 chaining 完成的,这是在另一个构造函数的开头调用基类构造函数的过程。
现在Eclipse(我没有使用它,所以我基于你在你的问题中描述的内容)可能会列出可用于链接的构造函数,因为查找它们是一种非常常见的情况(除非你正在调用一个非常简单或无参数的构造函数)。换句话说,为方便起见,构造函数列在继承成员中,但正如我们所说,严格来说,它们不是继承的。
答案 2 :(得分:1)
构造函数是链接的:您编写的每个构造函数最终都必须调用其中一个超类构造函数。例如:
public class MyException extends RuntimeException {
public MyException(String message) {
super(message); // invokes RuntimeException(String) constructor
}
}
super(...)
或this(...)
构造函数调用(如果有)必须作为构造函数中的第一个语句出现。如果两者都没有指定,则隐式假定super()
,它将链接到超类的默认构造函数。 (如果超类没有默认构造函数,那么编译将失败。)
答案 3 :(得分:0)
构造函数不是成员,因此子类不会继承它们, 但是可以从中调用超类的构造函数 子类。
来源:http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
使用Ctrl + O的Eclipse方法帮助显示了您可以从当前类调用的所有方法。因此,父级构造函数也会显示在其中,因为您可以使用super
调用它。