为什么Java中的抽象类有构造函数?
为什么Java中的abstract
类有一个constructor
?
什么是构造,因为我们不能实例化一个abstract
类?
有什么想法吗?
Java中的构造函数并不实际“构build”对象,它用于初始化字段。
假设你的抽象类有字段x和y,并且你总是希望它们以某种方式初始化,而不pipe最终创build了什么实际的具体子类。 所以你创build一个构造函数并初始化这些字段。
现在,如果你有两个不同的抽象类的子类,当你实例化它们的构造函数时,父类的构造函数将被调用,并且字段将被初始化。
如果你什么都不做,父对象的默认构造函数将被调用。 但是,您可以使用super关键字在父类上调用特定的构造函数。
所有包括抽象类的类都可以有构造函数。当它的具体子类被实例化时,抽象类构造函数将被调用
因为另一个类可以扩展它,而子类需要调用一个超类的构造函数。
有两个原因:
1)抽象类具有constructors
并且在具体子类被实例化时总是调用这些构造函数。 我们知道,当我们要实例化一个类时,我们总是使用该类的构造函数。 现在,每个构造函数都会调用super()
的隐式调用来调用其超类的构造函数。
2)我们知道构造函数也被用来初始化一个类的字段。 我们也知道抽象类可能包含字段,有时需要通过构造函数初始化 。
由于抽象类具有状态(字段)和事件,所以需要以某种方式初始化它们。
我猜这个问题的根源是人们相信,一个构造函数的调用创build对象。 事实并非如此。 Java无处宣称一个构造函数调用创build一个对象。 它只是做我们想要的构造函数来做,就像初始化一些领域..就这些。 所以被调用的抽象类的构造函数并不意味着它的对象被创build。
明智的实现你会经常在子类的构造函数中看到super()语句,如下所示:
public class A extends AbstractB{ public A(...){ super(String constructorArgForB, ...); ... } }
public class A extends AbstractB{ public A(...){ super(String constructorArgForB, ...); ... } }