类体系设计与代码实现
// 基类
class BaseClass {
protected String data;
// 默认构造器
public BaseClass() {
System.out.println("BaseClass 默认构造器被调用");
}
// 重载构造器
public BaseClass(String data) {
this.data = data;
System.out.println("BaseClass 带参数构造器被调用,data: " + data);
}
}
// 中间层类
class MiddleClass extends BaseClass {
protected int value;
// 默认构造器
public MiddleClass() {
super();
System.out.println("MiddleClass 默认构造器被调用");
}
// 重载构造器
public MiddleClass(String data, int value) {
super(data);
this.value = value;
System.out.println("MiddleClass 带参数构造器被调用,value: " + value);
}
}
// 子类
class SubClass extends MiddleClass {
private boolean flag;
// 默认构造器
public SubClass() {
super();
System.out.println("SubClass 默认构造器被调用");
}
// 重载构造器,根据不同参数决定初始化不同资源
public SubClass(String data, int value, boolean flag) {
super(data, value);
this.flag = flag;
if (flag) {
System.out.println("SubClass 根据 flag 初始化特定资源");
} else {
System.out.println("SubClass 根据 flag 初始化另一套资源");
}
}
}
测试代码
public class Main {
public static void main(String[] args) {
SubClass subClass1 = new SubClass();
SubClass subClass2 = new SubClass("test data", 10, true);
}
}
可能出现的问题及避免方法
- 构造器调用顺序问题:
- 问题:如果在构造器中访问未初始化的成员变量,可能导致
NullPointerException
或其他错误。在多层继承中,父类构造器先于子类构造器执行,如果子类构造器依赖父类构造器初始化的数据,可能出现数据未准备好的情况。
- 避免方法:确保在父类构造器中完成必要的初始化工作,子类构造器通过
super
调用父类合适的构造器,遵循构造器调用顺序,避免在子类构造器早期访问未初始化的父类成员。
- 资源泄漏问题:
- 问题:在构造器中初始化资源(如文件句柄、数据库连接等),如果构造过程中抛出异常,可能导致资源无法正确释放,从而造成资源泄漏。
- 避免方法:使用
try - finally
块在构造器中管理资源。如果使用 Java 7 及以上版本,可以使用 try - with - resources
语句自动关闭实现了 AutoCloseable
接口的资源。
- 初始化逻辑重复问题:
- 问题:不同的构造器重载可能有重复的初始化逻辑,导致代码冗余。
- 避免方法:将重复的初始化逻辑提取到一个私有方法中,不同的构造器重载通过调用该私有方法来完成相同的初始化工作。