面试题答案
一键面试抽象类构造函数的主要作用
- 初始化成员变量:抽象类可能包含一些成员变量,构造函数可以用于初始化这些变量,为子类提供一个统一的初始状态。例如,抽象类
Shape
可能有一个color
成员变量,其构造函数可以对color
进行初始化。 - 约束子类初始化逻辑:通过在抽象类构造函数中执行一些逻辑,强制子类在初始化时遵循特定的规则。比如在抽象类中对一些资源进行初始化操作,子类在实例化时也能基于这个初始化状态继续操作。
实例化抽象类的子类对象时抽象类构造函数的调用过程
- 隐式调用:当创建抽象类的子类对象时,子类构造函数会隐式地首先调用抽象类的构造函数。这是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
。