You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Java类使其无法被实例化且不可继承?

如何实现既不能实例化也不能被继承的Java类?

嘿,这个问题问得很好,很多刚接触Java的开发者都会在这里混淆——毕竟abstract和final看起来像是互斥的两个关键字,但要实现既不能实例化也不能被继承的类,咱们得换个思路,不能只靠这两个关键字单独解决。

先拆解下你提到的两个关键字的局限:

  • 用abstract修饰类:确实能阻止直接实例化,但子类可以继承这个抽象类并实例化子类,达不到“不可继承”的要求。
  • 用final修饰类:能阻止继承,但外部可以直接通过new来创建这个类的实例,满足不了“不可实例化”的需求。

正确的实现方式:私有构造方法 + final类(可选但推荐)

核心思路是用私有构造方法来同时阻止实例化和继承,再配合final关键字明确表达类的设计意图。

来看代码示例:

public final class UtilityTool {
    // 私有构造方法:外部无法调用,阻止实例化
    private UtilityTool() {
        // 可选:抛出异常,防止有人通过反射强制实例化
        throw new AssertionError("该类禁止实例化");
    }

    // 类中通常存放静态方法/静态常量,比如工具类的功能
    public static void printInfo() {
        System.out.println("这是一个工具类的静态方法");
    }

    public static final String DEFAULT_MESSAGE = "默认提示信息";
}

为什么这样可行?

  1. 阻止实例化:因为构造方法被声明为private,外部代码无法通过new UtilityTool()来创建实例,甚至同一个包内的其他类也不行。
  2. 阻止继承:
    • 一方面,final关键字直接标记类不可继承,语义清晰;
    • 另一方面,就算去掉final,私有构造方法也会让子类无法继承——因为子类的构造方法必须调用父类的构造方法,但父类构造是私有,编译器会直接报错。
  3. 防反射实例化:在私有构造里抛出AssertionError,就算有人用反射强行调用构造方法,也会触发异常,进一步保障类的不可实例化。

另一种可选实现:抽象类 + 私有构造

如果你不想用final,也可以用abstract类配合私有构造,效果一样:

public abstract class NoInstanceNoInherit {
    private NoInstanceNoInherit() {
        throw new AssertionError("禁止实例化");
    }
}

不过这种方式有点违背abstract的语义(抽象类本来是为了让子类继承扩展),所以更推荐用final类的写法,代码可读性更强。

总结

要实现既不能实例化也不能被继承的类,私有构造方法是核心,final关键字是增强语义的补充。单独用abstract或final都无法同时满足两个需求,结合私有构造才能达到目的。

内容的提问来源于stack exchange,提问作者Mauricio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:52:49