我正在学习OOP概念。在阅读有关继承的内容时,我了解到超类必须在初始化子类之前进行初始化,即所有超类的构造函数必须在子类构造函数之前运行。另外,我们可以直接创建超类的实例。例如。
SuperClass superClass = new SuperClass();
现在,我遇到了抽象类。看来我们无法实例化一个抽象类。要使用抽象类,您必须从另一个类继承它,并为其中的抽象方法提供实现。
我的问题是,在实例化具体子类时,将在具体子类的构造函数之前调用抽象超类的构造函数。如果是这种情况,为什么我不能直接实例化Abstract超类?
答案 0 :(得分:3)
抽象类就像没有轮子的自行车。它具有为车轮定义的空间,但自行车架卖家将车轮的类型留给最终卖家。它只是指出了轮子应该安装在框架上的位置以及要使用的螺栓。自行车上有一条链条,该链条指向后轮应该去的地方,以便在转动脚踏板时,后轮将向前推进。
您可以尝试骑那辆自行车,但是如果没有安装轮子,它就不会运动。由于没有轮子可以转动脚架,因此会发生错误。
您需要具体的卖方来定义轮子是否可以运行,只要它们以预定的方式连接即可。
图片由https://www.flickr.com/photos/vrogy/拍摄,已获得CC-BY 2.0许可
因此,尝试骑不带轮的自行车就是尝试实例化抽象类。
即使您可以使用它,它也没有用,而且由于缺少轮子而在向前兜售时也会抛出错误。
实例化方轮自行车时,它将正常工作,并在向前兜售时向前移动。
超类的实例纯粹是要附加的链条,方向盘能够移动,鞍座的高度已设置,所有标准特征(不包括已设置的车轮)。 车轮不是抽象自行车的关注点。那是要设置的具体课程。