java中的对象初始值设定项和构造函数之间有什么区别?

时间:2014-03-05 06:49:31

标签: java inheritance abstract-class

我已经研究过构造函数用于创建类对象并初始化实例字段。但是在抽象类中,当子类继承抽象类并且我们创建子类的对象时,也会创建构造函数。根据抽象类定义 我们无法创建抽象类的对象。所以如何在不创建抽象类的对象的情况下调用抽象类的构造函数。

5 个答案:

答案 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包含字段ab,并且您希望初始化这些字段,以便可以使用sub class abstract classconstructor进行初始化super()

答案 4 :(得分:0)

我认为最好的答案是在第一条评论中。在这种情况下,您实际上并不使用构造函数来实例化抽象类,而是初始化其状态和不变量。假设你被允许在不调用super(...)的情况下创建一个子类,有些情况下你会有一个部分构造的对象

public abstract class AbstractMe {
    protected List<Object> objects;
    protected AbstractMe() { 
         objects = new ArrayList<>();
    }
    protected int elements() { return objects.size(); }
}

如果你打电话给超级元素将永远正常,但如果你被允许不打电话,它可能是一个NPE,即使你的不变量是你班上总有一个列表。