当你定义一个Javaclass 构造时,Java编译器会在程序执行过程中自动创建一个没有参数的构造函数。
这意味着,在默认情况下,即使是Java中的abstract class ,也有一个默认的构造函数,什么都不做。
一个abstract class 不能直接实例化,所以你需要从子类构造函数中调用super() 来执行抽象构造函数。
例如,假设你有一个名为Dog 的抽象类,如下图所示:
abstract class Dog {
final String breed;
public Dog(String breed){
this.breed = breed;
}
}
在上述Dog 抽象类中,定义了一个构造函数来初始化final 变量breed 。
这个构造函数可以从任何扩展了Dog 类的class 中调用。
考虑一下下面的Terrier 类。它通过调用其构造函数中的super() 方法来调用Dog 构造函数:
class Terrier extends Dog {
public Terrier(String breed) {
super(breed);
}
}
通过创建一个有构造函数的abstract class ,你可以确保其子类将初始化final 变量。
当子类的实例被创建时,该变量被初始化,然后不能被改变。
有一种情况下,你可能想在一个抽象类中定义一个构造函数,那就是当你想强制要求超类的所有子类都初始化特定的成员变量。
这些变量不一定是final ,但是如果你的抽象类有一个或多个变量,并且你希望它们在实例化时被初始化,那么你需要创建构造函数。
最后,一个抽象类的构造函数的行为就像其他类的类型一样。
唯一的区别是,你不能实例化一个抽象类,所以你需要扩展它并使用super() 来调用构造函数。
所以,是的,当你需要的时候,你可以在Java中创建一个抽象类构造函数。