我已经研究过构造函数用于创建类对象并初始化实例字段。但是在抽象类中,当子类继承抽象类并且我们创建子类的对象时,也会创建构造函数。根据抽象类定义 我们无法创建抽象类的对象。所以如何在不创建抽象类的对象的情况下调用抽象类的构造函数。
答案 0 :(得分:0)
当您创建子类时,您将被迫调用超类构造函数。
答案 1 :(得分:0)
我不确定这回答你的问题有多好,但根据我的经验,我只使用抽象构造函数在子类构造函数中调用super()
。我不能说Parent x = new Parent();
但我可以说Parent y = new Child()
Child()
的第一行是super();
,基本上是Parent();
。
答案 2 :(得分:0)
我们不能创建抽象类的对象,但我们可以创建抽象类的构造函数,我们可以使用super()
abstract class abc{
abc(){}
}
class Test extends abc{
super();
}
一个构造函数初始化字段的实例,如果它们在初始化时没有任何值,则给它们默认值
class A{
int b;
}
A a = new A();
System.out.println("value of b "+b);
answer is : value of b 0
构造函数使用默认值
初始化fileds答案 3 :(得分:0)
通过使用super()
,您可以从其子类中调用抽象类的构造函数。
例如。您的abstract class
包含字段a
和b
,并且您希望初始化这些字段,以便可以使用sub class
abstract class
从constructor
进行初始化super()
。
答案 4 :(得分:0)
我认为最好的答案是在第一条评论中。在这种情况下,您实际上并不使用构造函数来实例化抽象类,而是初始化其状态和不变量。假设你被允许在不调用super(...)的情况下创建一个子类,有些情况下你会有一个部分构造的对象
public abstract class AbstractMe {
protected List<Object> objects;
protected AbstractMe() {
objects = new ArrayList<>();
}
protected int elements() { return objects.size(); }
}
如果你打电话给超级元素将永远正常,但如果你被允许不打电话,它可能是一个NPE,即使你的不变量是你班上总有一个列表。