2010-01-31 67 views
51

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

这是什么构造,因为我们不能实例化一个abstract类?

有什么想法?

+1

退房这个问题澄清,http://stackoverflow.com/questions/260666/abstract-class-constructor-in-java –

+0

您需要一种方法来构建子类的抽象类。从技术上讲,抽象类上的公共构造函数实际上只是一个受保护的构造函数。 –

回答

70

Java中的构造函数实际上并没有“建”的对象,它是用来

+4

通常情况下,如果你把构造函数链兼顾理论,那么父类的构造先叫孩子构造函数执行 – Stranger

+0

'现在,如果你有你的抽象类,两种不同的子类,当你实例化它们自己的构造函数将被调用之前,然后父类的构造将被调用,该领域将是initialized.'你的意思是第一个孩子的类的构造函数会叫什么名字? :o – UnKnown

+0

每次流这样的时刻 - '盛大母公司constructor' - >'父constructor' - >'孩子constructor' –

7

因为另一个类可以扩展它,并且子类需要调用超类的构造函数。当它的具体子类将被实例化

9

所有包括抽象类可以有constructors.Abstract类构造函数的类会被调用初始化字段。

想象你的抽象类有字段x和y,并且你总是希望它们以某种方式初始化,而不管最终创建了什么实际的具体子类。所以你创建一个构造函数并初始化这些字段。

现在,如果你有你的抽象类,两种不同的子类,当你实例化它们自己的构造函数将被调用,然后父类的构造将被调用,字段将被初始化。

如果您不做任何事情,父项的默认构造函数将被调用。但是,您可以使用super关键字在父类上调用特定的构造函数。

1

实施明智的你经常会里面的超级看到在子类的构造函数()语句,像:

 

public class A extends AbstractB{ 

    public A(...){ 
    super(String constructorArgForB, ...); 
    ... 
    } 
} 

 
4

因为抽象类有状态(场),他们需要以某种方式初始化somethimes。

7

两个原因:

1)抽象类具有constructors当一个具体子类实例化的构造函数总是被调用。我们知道,当我们要实例化一个类时,我们总是使用该类的构造函数。现在,每个构造函数都会调用超类的构造函数,并隐式调用super()

2)我们知道构造函数也用于初始化类的字段。我们也知道抽象类可能包含字段,有时候他们需要使用构造函数以某种方式初始化

+0

Debmalya达斯(SCJP&SCWCD) – Debmalya

2

我想这个问题的根源在于,人们认为,一个构造函数的调用创建的对象。事实并非如此。 Java无处宣称构造函数调用会创建一个对象。它只是做我们想要构造函数做的事情,比如初始化一些字段......就这些。所以被调用的抽象类的构造函数并不意味着它的对象被创建。