我想知道抽象类的构造函数的用途是什么;因为我们没有实例化抽象类,为什么我们需要这样的构造函数?
答案 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()
方法中。