MST

星途 面试题库

面试题:Java构造方法重载与默认构造器:复杂场景下的应用

考虑一个具有多层继承结构(至少三层)的Java类体系,且每个类都存在构造方法重载和默认构造器。要求在某些特定的子类构造方法调用时,通过父类构造方法的不同重载形式实现对一些复杂业务逻辑的初始化(例如,根据不同参数决定初始化不同的资源)。请设计这样一个类体系,并编写相关代码实现。同时,分析可能出现的问题以及如何避免这些问题。
11.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

类体系设计与代码实现

// 基类
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);
    }
}

可能出现的问题及避免方法

  1. 构造器调用顺序问题
    • 问题:如果在构造器中访问未初始化的成员变量,可能导致 NullPointerException 或其他错误。在多层继承中,父类构造器先于子类构造器执行,如果子类构造器依赖父类构造器初始化的数据,可能出现数据未准备好的情况。
    • 避免方法:确保在父类构造器中完成必要的初始化工作,子类构造器通过 super 调用父类合适的构造器,遵循构造器调用顺序,避免在子类构造器早期访问未初始化的父类成员。
  2. 资源泄漏问题
    • 问题:在构造器中初始化资源(如文件句柄、数据库连接等),如果构造过程中抛出异常,可能导致资源无法正确释放,从而造成资源泄漏。
    • 避免方法:使用 try - finally 块在构造器中管理资源。如果使用 Java 7 及以上版本,可以使用 try - with - resources 语句自动关闭实现了 AutoCloseable 接口的资源。
  3. 初始化逻辑重复问题
    • 问题:不同的构造器重载可能有重复的初始化逻辑,导致代码冗余。
    • 避免方法:将重复的初始化逻辑提取到一个私有方法中,不同的构造器重载通过调用该私有方法来完成相同的初始化工作。