MST
星途 面试题库

面试题:Java中抽象类构造函数的作用及调用时机

在Java里,抽象类可以有构造函数。请阐述抽象类构造函数的主要作用是什么,以及在实例化抽象类的子类对象时,抽象类构造函数是如何被调用的?
32.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

抽象类构造函数的主要作用

  1. 初始化成员变量:抽象类可能包含一些成员变量,构造函数可以用于初始化这些变量,为子类提供一个统一的初始状态。例如,抽象类Shape可能有一个color成员变量,其构造函数可以对color进行初始化。
  2. 约束子类初始化逻辑:通过在抽象类构造函数中执行一些逻辑,强制子类在初始化时遵循特定的规则。比如在抽象类中对一些资源进行初始化操作,子类在实例化时也能基于这个初始化状态继续操作。

实例化抽象类的子类对象时抽象类构造函数的调用过程

  1. 隐式调用:当创建抽象类的子类对象时,子类构造函数会隐式地首先调用抽象类的构造函数。这是Java的机制,在子类构造函数的第一行(如果没有显式调用其他构造函数),会默认调用父类(这里是抽象类)的无参构造函数。例如:
abstract class AbstractClass {
    AbstractClass() {
        System.out.println("AbstractClass constructor");
    }
}
class SubClass extends AbstractClass {
    SubClass() {
        System.out.println("SubClass constructor");
    }
}
public class Main {
    public static void main(String[] args) {
        SubClass sub = new SubClass();
    }
}

在上述代码中,当创建SubClass对象时,会先输出AbstractClass constructor,然后输出SubClass constructor。 2. 显式调用:如果抽象类没有无参构造函数,只有带参数的构造函数,子类构造函数必须通过super关键字显式调用抽象类的构造函数,并传递合适的参数。例如:

abstract class AbstractClass {
    AbstractClass(int value) {
        System.out.println("AbstractClass constructor with value: " + value);
    }
}
class SubClass extends AbstractClass {
    SubClass() {
        super(10);
        System.out.println("SubClass constructor");
    }
}
public class Main {
    public static void main(String[] args) {
        SubClass sub = new SubClass();
    }
}

在这个例子中,SubClass构造函数通过super(10)显式调用AbstractClass带参数的构造函数,输出AbstractClass constructor with value: 10,然后输出SubClass constructor