为什么构造函数在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 } }
如果我们在 Child 类中定义 Parent 类构造函数,它将给出返回类型的编译时错误并将其视为方法。但是对于 print 方法,它不会给出任何编译时错误,并认为它是一种覆盖方法。
- 现在假设如果构造函数可以被继承,那么就不可能实现封装。因为通过使用超类的构造函数,我们可以访问/初始化类的私有成员。
- 构造函数不能作为方法调用。它在创建类的对象时调用,因此使用父类构造函数表示法创建子类对象没有意义。即孩子 c = new Parent();
- 父类构造函数不会在子类中继承,这就是为什么如果没有显式调用 super 或 this,super() 会自动添加到子类构造函数中。