为什么Java中的abstract
类具有constructor
?
它是什么构建的,因为我们无法实例化abstract
类?
有什么想法吗?
答案 0 :(得分:78)
Java中的构造函数实际上并不“构建”对象,它用于初始化字段。
想象一下,你的抽象类有字段x和y,并且你总是希望它们以某种方式初始化,无论最终创建什么实际的具体子类。因此,您创建一个构造函数并初始化这些字段。
现在,如果您有两个不同的抽象类子类,当您实例化它们时,将调用它们的构造函数,然后将调用父构造函数并初始化字段。
如果您不执行任何操作,将调用父级的默认构造函数。但是,您可以使用super关键字来调用父类的特定构造函数。
答案 1 :(得分:10)
包括抽象类在内的所有类都可以有构造函数。当实例化具体子类时,将调用抽象类构造函数
答案 2 :(得分:10)
有两个原因:
1)抽象类具有constructors
,并且在实例化具体子类时始终调用这些构造函数。我们知道当我们要实例化一个类时,我们总是使用该类的构造函数。现在,每个构造函数都调用其超类的构造函数,并隐式调用super()
。
2)我们知道构造函数也用于初始化类的字段。我们也知道抽象类可能包含字段,有时需要使用构造函数以某种方式初始化。
答案 3 :(得分:7)
因为另一个类可以扩展它,并且子类需要调用超类构造函数。
答案 4 :(得分:4)
因为抽象类具有状态(字段),有时需要以某种方式初始化它们。
答案 5 :(得分:3)
我猜这个问题的根源是人们认为对构造函数的调用会创建对象。事实并非如此。 Java没有声称构造函数调用创建了一个对象。它只是做我们想要的构造函数来做,比如初始化一些字段......就是这样。因此,调用抽象类的构造函数并不意味着它的对象已创建。
答案 6 :(得分:1)
实现方面,你经常会在子类构造函数中看到super()语句,例如:
public class A extends AbstractB{
public A(...){
super(String constructorArgForB, ...);
...
}
}