构造函数不是一个类的成员吗?

Pan*_*edi 10 java oop inheritance constructor

构造函数不是一个类的成员吗?如果是,为什么他们不能继承?

JLS 7.0说构造函数不是成员,因此不能继承.这对Java来说是真的吗?还是一般的OOP范例?

kev*_*vin 6

构造函数不是出于好的设计原因而继承的.如果它们是继承的,那么在尝试将它们隐藏在继承的类中时会遇到问题.

考虑这个例子:

class Plane{
    public Plane(int passengerCapacity, int cargoCapacity){...}
}
class F18 extends Plane{
    public F18(){
        super(0,0);
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,以下构造函数是否有意义?

Plane p = new F18(0,0);
Run Code Online (Sandbox Code Playgroud)

不是真的,因为子类是父类的特例.在这个特定的例子中,在F18类中提供Plane构造函数是没有意义的.子类希望控制父类的构造方式.

如果构造函数是继承的,并且有人希望隐藏父构造函数,那么它们可能会尝试执行以下操作:

class F18{
    Plane innerPlane;
    public F18(){
        innerPlane = new Plane(0,0);
    }
}
Run Code Online (Sandbox Code Playgroud)

不是真正的解决方案,因为在每个方法和属性中,都必须编写return innerPlane.SomeMethod();,这几乎违背了继承的目的.

此原则也适用于其他OOP语言(例如C#).

但是,如果我真的想继承许多子类中的构造函数,该怎么办...

那你的架构是错的.您实际上不需要继承来解决您的问题.您可以抽象另一个基类/接口中不同的部分.例如

class Plane{
    IPilot Pilot;
    public Plane(int passengerCapacity, int cargoCapacity, IPilot pilot){...}
}
Run Code Online (Sandbox Code Playgroud)

构造函数是构造对象的方法.你真的需要很多子类,它们可以以相同的方式构造(并使用相同的逻辑,因为它们是继承的),或者是一个可以灵活地交换掉它的一些组件的类吗?