Java 为什么构造函数不被继承
构造函数是一个代码块,它允许你创建一个类的对象,它的名字与类相同,没有明确的返回类型。
每当一个类(子类)扩展另一个类(父类)时,子类会以变量和方法的形式继承其超类的状态和行为,但由于以下原因,它不会继承超类的构造器。
- 构造函数是特殊的,它的名字与类的名字相同。因此,如果构造函数在子类中被继承,那么子类将包含一个父类的构造函数,这违反了构造函数应该与类名相同的约束条件。例如,请看下面的代码。
class Parent {
public Parent()
{
}
public void print()
{
}
}
public class Child extends Parent {
public Parent()
{
}
public void print()
{
}
public static void main(String[] args)
{
Child c1 = new Child(); // allowed
Child c2 = new Parent(); // not allowed
}
}
如果我们在子类中定义父类的构造函数,会在编译时出现返回类型的错误,并认为它是一个方法。但是对于打印方法来说,它不会产生任何编译错误,并认为它是一个重写方法。
- 现在假设构造函数可以被继承,那么就不可能实现封装了。因为通过使用超类的构造函数,我们可以访问/初始化一个类的私有成员。
- 构造函数不能作为一个方法被调用。它在类的对象被创建时被调用,所以使用父类的构造函数符号来创建子类对象是没有意义的。
- 父类构造函数在子类中不被继承,这就是为什么如果没有明确地调用super或this,子类构造函数中会自动添加super()。