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

Java内部枚举、内部类是否高效?内存占用机制详解

核心问题

我经常看到开发者在类内部定义枚举,示例代码如下:

public class Person {
  enum Gender {
    MALE,
    FEMALE,
    OTHER
  }
  // 其余类成员省略
}

我对这种写法的底层运行机制存在疑问:每次通过new Person()创建新的Person实例时,会不会同步生成这个枚举类的新实例?内部枚举会不会随着Person实例的创建持续占用更多内存,还是说全局只保留单份实例?


实测验证

我在Java 11环境下结合相关解答做了简单测试,测试代码如下:

public class Person {
    String name;
    int age;
    Address address = new Address(); // 日常开发常见的写法
    public class Address {
        String city;
        String country;
        int number;
    }
}

public class Test {
    public static void main(String[] args) {
        var a = new Person.Address(); 
        // 上行编译报错:'innerclass.Person' is not an enclosing class, 提示将Address设为静态
        var p = new Person();
        var a1 = p.new Address(); 
        // 上行是在外部类之外创建非静态内部类对象的正确语法
    }
}

我之前完全不知道创建非静态内部类对象还有这种特殊语法,不过考虑到日常开发中基本都是在外部类内部使用内部类(比如各种数据结构里的迭代器实现),对这种语法陌生很正常。
从测试能得到的直观结论:非静态内部类对象会根据实际调用需求创建,且必须绑定一个外部类实例,本身不存在无端的内存浪费或者效率问题。


最终结论

原问题下两类解答思路都很有参考价值:一类从Java语言规范的底层定义切入明确规则,一类从实例化逻辑出发做通俗易懂的推演,结合起来就能完全搞懂相关机制,核心结论如下:

  • 按照Java的类定义规范,只有非静态的嵌套类才属于内部类,枚举(Enum)、记录类(Record)本质上默认就是静态的嵌套类,不属于内部类范畴。
  • 问题中定义在Person类内部的Gender枚举,会在类加载阶段完成初始化,其中的MALE、FEMALE、OTHER三个枚举值全局仅存在一份实例。无论创建多少个Person实例,都不会重复生成枚举类或者枚举值的新对象,完全不会出现随Person实例创建持续消耗额外内存的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:27:19