Java抽象类中的构造函数如何调用
在Java中,抽象类不能被实例化,因此抽象类的构造函数不会像普通类那样被直接调用。然而,抽象类的构造函数可以在创建子类对象时被调用。当创建子类的实例时,子类的构造函数会隐式或显式地调用抽象类的构造函数。以下是两种调用抽象类构造函数的方法:
- 隐式调用:当创建子类的实例时,如果子类的构造函数没有显式地调用抽象类的构造函数,编译器会自动插入一个对抽象类无参构造函数的调用。例如:
abstract class AbstractClass {
AbstractClass() {
System.out.println("AbstractClass constructor called");
}
}
class ConcreteClass extends AbstractClass {
ConcreteClass() {
// 编译器会自动插入对AbstractClass无参构造函数的调用
System.out.println("ConcreteClass constructor called");
}
}
public class Main {
public static void main(String[] args) {
ConcreteClass obj = new ConcreteClass();
}
}
输出结果:
AbstractClass constructor called
ConcreteClass constructor called
- 显式调用:子类的构造函数可以通过
super()关键字显式地调用抽象类的构造函数。例如:
abstract class AbstractClass {
AbstractClass(String message) {
System.out.println("AbstractClass constructor called with message: " + message);
}
}
class ConcreteClass extends AbstractClass {
ConcreteClass() {
super("Hello from ConcreteClass"); // 显式调用AbstractClass的带参数构造函数
System.out.println("ConcreteClass constructor called");
}
}
public class Main {
public static void main(String[] args) {
ConcreteClass obj = new ConcreteClass();
}
}
输出结果:
AbstractClass constructor called with message: Hello from ConcreteClass
ConcreteClass constructor called
总之,虽然不能直接实例化抽象类,但在创建子类对象时,抽象类的构造函数会被调用。这有助于初始化抽象类中的成员变量和方法,以便在子类中使用。