Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构造函数不是类的成员吗?_Java_Oop_Inheritance_Constructor - Fatal编程技术网

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

Java 构造函数不是类的成员吗?,java,oop,inheritance,constructor,Java,Oop,Inheritance,Constructor,构造函数不是类的成员吗?如果是,为什么不能继承 因此不能被继承。这是Java独有的还是通用的OOP范例?继承构造函数的概念在大多数范例中没有意义;相反,构造函数的调用顺序与继承顺序相反,因此,例如,如果您有: Pidgeon -> Bird -> Animal 其中->表示“继承自”,然后要构造Pidgeon它首先调用Animal构造函数,然后调用Bird构造函数,最后调用Pidgeon构造函数。如果它没有这样做,那么您必须初始化您从中继承的类的所有成员,或者手动调用基类的构造函数

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


因此不能被继承。这是Java独有的还是通用的OOP范例?

继承构造函数的概念在大多数范例中没有意义;相反,构造函数的调用顺序与继承顺序相反,因此,例如,如果您有:

Pidgeon -> Bird -> Animal
其中
->
表示“继承自”,然后要构造
Pidgeon
它首先调用
Animal
构造函数,然后调用
Bird
构造函数,最后调用
Pidgeon
构造函数。如果它没有这样做,那么您必须初始化您从中继承的类的所有成员,或者手动调用基类的构造函数(如果您有特定的参数要传递,您可能无论如何都必须这样做)


或者,换言之,虽然派生类中的函数通常会替换基类中的函数,但构造函数会扩展基类中的函数。

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

考虑这个例子:

class Plane{
    public Plane(int passengerCapacity, int cargoCapacity){...}
}
class F18 extends Plane{
    public F18(){
        super(0,0);
        ....
    }
}
现在,下面的构造函数有意义吗

Plane p = new F18(0,0);
不太可能,因为子类是父类的特例。在这个特定的例子中,在F18类中提供平面构造函数是没有意义的;子类希望控制父类的构造方式

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

class F18{
    Plane innerPlane;
    public F18(){
        innerPlane = new Plane(0,0);
    }
}
不是真正的解决方案,因为在每个方法和属性中,都必须编写
返回innerPlane.SomeMethod(),这几乎违背了继承的目的

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

但是如果我真的想在许多子类中继承构造函数呢…

那么你的架构是错误的。实际上,您不需要继承来解决您的问题。您可以抽象另一个基类/接口中不同的部分。e、 g

class Plane{
    IPilot Pilot;
    public Plane(int passengerCapacity, int cargoCapacity, IPilot pilot){...}
}

构造函数是构造对象的方法。您真的需要许多可以以相同的方式构造的子类(并且使用相同的逻辑,因为它们是继承的),还是需要一个能够灵活地交换某些组件的类?

尽管您可能听说过,这不是一般的OOP范例。我认为,有一些旧的OOP语言,其中构造函数只是普通的方法。但是目前许多流行的语言以不同的方式对待构造函数,就像对待其他方法一样。这是一个不完美的解决方案,导致一些解决方案,如bean规范中的建议,只有一个参数构造函数。< /P>它在哪里?第8.2节,在JL7.7.0版本的PDF版本中的第197页,继承C++必须将它设置为虚拟的,关于java IDK<代码> SUBE()
的存在是为了调用Java的父构造函数。如果您仔细想想,构造函数是类的一部分,但不是实例。您可能还想添加
super()
可以调用
default
private
构造函数,以实现“良好的设计目标”。谢谢,kayson!这个解释很贴切。