📜  为什么构造函数在Java中不被继承?

📅  最后修改于: 2022-05-13 01:55:22.951000             🧑  作者: Mango

为什么构造函数在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() 会自动添加到子类构造函数中。