为什么Java中的抽象类具有构造函数?

时间:2010-01-31 03:56:23

标签: java constructor abstract-class

为什么Java中的abstract类具有constructor

它是什么构建的,因为我们无法实例化abstract类?

有什么想法吗?

7 个答案:

答案 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, ...);
     ...
  }
}