在Java中为抽象类创建构造函数有什么用?

时间:2010-01-20 23:14:08

标签: java constructor abstract-class

我想知道抽象类的构造函数的用途是什么;因为我们没有实例化抽象类,为什么我们需要这样的构造函数?

8 个答案:

答案 0 :(得分:9)

有时您会对所有继承类需要设置的实例变量进行一些常见的初始化。您在扩展它时实例化一个抽象类,并且该具体类具有一个构造函数,该构造函数将向抽象类的构造函数提供参数。

答案 1 :(得分:5)

它们仍然可以由继承自那个的类的构造函数调用,使代码重构很好地用于在抽象类中使用构造函数。

答案 2 :(得分:3)

如果您在抽象类中有未初始化的最终字段,则需要在构造函数中初始化它们。

E.g。

abstract class A {
    final int x;
}
如果没有分配给x的构造函数,

将无法编译。

答案 3 :(得分:3)

如果你的类没有声明构造函数,javac将为你创建一个no-arg,do-nothing构造函数。然后,当你的子类被初始化时,它将调用生成的no-op构造函数,并且生命是好的。

但是,如果你的类声明了任何构造函数,javac将不会为你创建一个。在这种情况下,子类构造函数需要显式调用父类的构造函数。否则,您将无法初始化父类的成员,如上面的答案所述。

答案 4 :(得分:2)

抽象类的构造函数由子类使用(使用super(params)从子类构造函数调用)。

你应该让这些构造函数protected明确这一点。

答案 5 :(得分:2)

您不实例化抽象类,但在实例化子类时调用构造函数。

用法可以初始化常见属性,即。

import java.util.List;
import java.util.ArrayList;
abstract class BaseClass {
    protected List list; // visible from subclasses

    public BaseClass() {
        System.out.println("to abstract...");
        // common initialization to all subclasses
        list = new ArrayList();
        list.add("a");
        list.add("a");
        list.add("a");
    }
}

class ConcreteClass extends BaseClass {
    public ConcreteClass(){
        // The list is initialized already
        System.out.println("now it is concrete and the list is: = "+ this.list );


    }
}

class TestAbstractClass {
    public static void main( String [] args ) {
        BaseClass instance = new ConcreteClass();
    }

}

输出

$ java TestAbstractClass
to abstract...
now it is concrete and the list is: = [a, a, a]

答案 6 :(得分:1)

重复复制常识/行为。

E.g。汽车:你的所有汽车都将由一个车身,四个车轮和一个发动机构成。因此,您可以通过调用Body(),Wheel(int x),Engine()等函数在抽象Car类的构造函数中完成构造的这一部分。每个特定的汽车类都有自己的Body(),Wheel()和Engine()实现 - 但它们都将采用相同的步骤从它们构建汽车,因此不需要在每个汽车中复制这些步骤类。在这种情况下,您在祖先中实现了这种常见行为。

答案 7 :(得分:-1)

我同意,构造函数是在假设有实例的情况下创建的。如果您有很多常用代码,可以考虑创建一个构造函数,但最好将它放在init()方法中。