Java 内部类和内部枚举的深入理解和示例参考

详解枚举类的实现过程,深入理解枚举类是如何设计出来的 文章内容输出来源:拉勾教育大数据训练营; 为什么需要枚举类? 因为现实生活中有的事物只有明确的几个固定值,我们不希望用户再创建出其它的值,所以我们需要枚举类把描述这些事物的值一一列举出来。 比如:季节、性别、键盘上的方向键等 我们如何自己设计枚举类? 枚举类enum是从Java5引入的。 那么在之前我们如何自己设计枚举类呢?枚举类的设计过程可以参考单例模式的设计思路。 单例模式的设计思路在我的上一篇文章中有详细讲解,不明白的朋友可以先看这篇文章 Java设计模式之单例模式的设计思路与具体实现 单 阅读详情

作为一名 Java 后端开发程序员,深入理解内部类(Inner Class)和内部枚举(Inner Enum)不仅是掌握语言特性的关键,更是写出高内聚、低耦合、结构清晰的生产级代码的基础。它们在 Spring、MyBatis、工具类、配置封装、状态机设计等场景中被广泛使用。

下面我将系统性地为你解析:

  • 普通内部类(非静态内部类)
  • 静态内部类(Static Nested Class)
  • 内部枚举(Inner Enum)

并对比它们的区别、特点、使用场景,最后提供真实开发场景中的完整示例,附带详细中文注释,助你彻底掌握其应用精髓。


✅ 一、什么是内部类与内部枚举?

🔹 内部类(Inner Class)

定义在另一个类的内部的类。它能直接访问外部类的所有成员(包括私有),是 Java 实现“逻辑封装”和“多继承模拟”的重要手段。

🔹 内部枚举(Inner Enum)

定义在另一个类内部的枚举类型。它本质上是静态的(即使不加 static),是 Java 为枚举类型设计的特殊规则。常用于限定作用域,避免污染全局命名空间。


✅ 二、三者核心区别对比表

特性普通内部类(非静态)静态内部类内部枚举
是否依赖外部类实例✅ 必须依赖外部类实例❌ 不依赖,可独立创建❌ 不依赖(隐式静态)
能否访问外部类私有成员✅ 可以✅ 可以(但需通过外部类对象)✅ 可以
内存开销⚠️ 每个实例持有一个外部类引用,易内存泄漏✅ 无额外引用,轻量✅ 无额外引用,轻量
创建方式Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();Outer.StaticInner si = new Outer.StaticInner();Outer.Status status = Outer.Status.ACTIVE;
是否可以声明 static 成员❌ 不可(除非是常量)✅ 可以✅ 可以(枚举本身就是静态常量)
推荐使用场景需要频繁访问外部类上下文(如监听器、回调)工具类、配置类、Builder 模式、避免命名冲突定义仅在外部类中使用的状态/类型(如订单状态、用户角色)

💡 重要结论:

  • 除非你明确需要访问外部类的非静态成员,否则优先使用静态内部类。
  • 内部枚举永远是隐式静态的,且推荐用于限定作用域的常量集合。

✅ 三、详细实战示例(带中文注释)

🌟 示例 1:普通内部类 —— 用于事件监听器(GUI/异步回调)

场景:在服务层封装一个异步任务处理器,任务执行完成后需要回调通知外部调用者。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class AsyncTaskProcessor {

    private String taskId;
    private String context; // 外部类状态

    public AsyncTaskProcessor(String taskId, String context) {
        this.taskId = taskId;
        this.context = context;
    }

    // ✅ 普通内部类:监听器,需要访问外部类的 taskId 和 context
    public class TaskListener {
        public void onSuccess(String result) {
            // ✅ 直接访问外部类的私有成员!这是普通内部类的核心价值
            System.out.println("✅ 任务 " + taskId + " 在上下文 '" + context + "' 中成功完成,结果:" + result);
            // 可以触发外部类的其他方法,如更新缓存、发送通知等
            updateTaskStatus(taskId, "SUCCESS");
        }

        public void onFailure(Exception e) {
            System.err.println("❌ 任务 " + taskId + " 在上下文 '" + context + "' 中失败:" + e.getMessage());
            logError(taskId, e);
        }
    }

    // ✅ 暴露一个方法,供外部传入监听器
    public void executeAsync(TaskListener listener) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> {
            try {
                // 模拟耗时任务
                Thread.sleep(2000);
                String result = "处理完成:" + context;
                listener.onSuccess(result); // 回调
            } catch (Exception e) {
                listener.onFailure(e);
            }
        });
        executor.shutdown();
    }

    // 外部类私有方法,内部类可调用
    private void updateTaskStatus(String id, String status) {
        System.out.println("📊 更新任务状态:" + id + " -> " + status);
    }

    private void logError(String id, Exception e) {
        System.out.println("📝 记录错误日志:任务ID=" + id + ", 错误=" + e.getClass().getSimpleName());
    }

    // ✅ 使用示例
    public static void main(String[] args) {
        AsyncTaskProcessor processor = new AsyncTaskProcessor("T001", "用户登录");

        // ✅ 创建内部类实例必须通过外部类实例
        TaskListener listener = processor.new TaskListener(); // ⚠️ 注意:必须用 processor.new

        processor.executeAsync(listener);

        // 输出示例:
        // ✅ 任务 T001 在上下文 '用户登录' 中成功完成,结果:处理完成:用户登录
        // 📊 更新任务状态:T001 -> SUCCESS
    }
}

📌 使用场景:

  • GUI 编程中的事件监听器(如按钮点击)
  • 异步回调机制(如 Spring 的 @Async + 回调接口)
  • 需要共享外部类状态的闭包式逻辑(如观察者模式)

⚠️ 注意:普通内部类会持有外部类的引用,在 Spring Bean 或长生命周期对象中使用时可能导致内存泄漏(如在静态缓存中存放内部类实例)。


🌟 示例 2:静态内部类 —— Builder 模式 + 工具类封装(推荐生产级使用)

场景:构建一个复杂的配置对象(如数据库连接池配置),使用 Builder 模式提高可读性与安全性。

import java.util.HashMap;
import java.util.Map;

public class DatabaseConfig {

    private final String url;
    private final String username;
    private final String password;
    private final int maxPoolSize;
    private final long connectionTimeout;

    // ✅ 私有构造器:禁止外部直接 new,强制通过 Builder 创建
    private DatabaseConfig(Builder builder) {
        this.url = builder.url;
        this.username = builder.username;
        this.password = builder.password;
        this.maxPoolSize = builder.maxPoolSize;
        this.connectionTimeout = builder.connectionTimeout;
    }

    // ✅ 静态内部类:Builder 模式 —— 不依赖外部类实例,轻量、安全
    public static class Builder {
        private String url;
        private String username;
        private String password;
        private int maxPoolSize = 20; // 默认值
        private long connectionTimeout = 5000; // 默认5秒

        public Builder url(String url) {
            this.url = url;
            return this;
        }

        public Builder username(String username) {
            this.username = username;
            return this;
        }

        public Builder password(String password) {
            this.password = password;
            return this;
        }

        public Builder maxPoolSize(int maxPoolSize) {
            this.maxPoolSize = maxPoolSize;
            return this;
        }

        public Builder connectionTimeout(long timeoutMs) {
            this.connectionTimeout = timeoutMs;
            return this;
        }

        // ✅ 构建最终对象
        public DatabaseConfig build() {
            if (url == null || url.isBlank()) {
                throw new IllegalStateException("数据库 URL 不能为空");
            }
            if (username == null || username.isBlank()) {
                throw new IllegalStateException("数据库用户名不能为空");
            }
            return new DatabaseConfig(this);
        }
    }

    // ✅ 静态内部类:工具类,用于生成常用配置模板
    public static class Templates {
        // ✅ 静态方法 + 静态内部类:无需实例化,直接调用
        public static DatabaseConfig localDev() {
            return new Builder()
                    .url("jdbc:mysql://localhost:3306/dev_db")
                    .username("dev_user")
                    .password("dev_pass")
                    .maxPoolSize(10)
                    .build();
        }

        public static DatabaseConfig production() {
            return new Builder()
                    .url("jdbc:mysql://prod-db.cluster:3306/app_db")
                    .username("prod_admin")
                    .password(System.getenv("DB_PASSWORD")) // 从环境变量读取
                    .maxPoolSize(100)
                    .connectionTimeout(10000)
                    .build();
        }
    }

    // ✅ Getter 方法(为简化,省略)
    public String getUrl() { return url; }
    public String getUsername() { return username; }
    public int getMaxPoolSize() { return maxPoolSize; }

    // ✅ 使用示例:生产环境调用
    public static void main(String[] args) {
        // ✅ 静态内部类:直接通过外部类名访问,无需创建外部类实例
        DatabaseConfig config = new DatabaseConfig.Builder()
                .url("jdbc:mysql://192.168.1.10:3306/myapp")
                .username("app_user")
                .password("secret123")
                .maxPoolSize(50)
                .build();

        System.out.println("✅ 创建的数据库配置:" + config.getUrl());

        // ✅ 使用静态内部类的工具方法
        DatabaseConfig devConfig = DatabaseConfig.Templates.localDev();
        System.out.println("🔧 开发环境模板:" + devConfig.getUrl());

        // ✅ 静态内部类的优势:不持有外部引用,可被缓存、序列化、线程安全
    }
}

📌 使用场景:

  • Builder 模式:构造参数多、可选参数复杂的对象(如 Spring Boot 的 @ConfigurationProperties)
  • 工具类封装:如 Collections.singletonList()、Map.of() 的实现方式
  • 避免命名污染:将辅助类隐藏在主类中,提升封装性
  • 性能优势:无外部类引用,GC 更高效,适合高频创建

✅ 强烈推荐:在绝大多数情况下,使用静态内部类代替普通内部类,除非你明确需要访问外部类的非静态成员。


🌟 示例 3:内部枚举 —— 限定作用域的状态码(推荐用于业务状态)

场景:订单系统中,订单状态仅在订单上下文中使用,不应暴露为全局枚举。

import java.time.LocalDateTime;

public class Order {

    // ✅ 内部枚举:订单状态,仅在 Order 类中使用,避免全局污染
    public enum Status {
        PENDING("待支付"),      // 未付款
        PAID("已支付"),         // 已付款,等待发货
        SHIPPED("已发货"),      // 物流已发出
        DELIVERED("已送达"),    // 客户签收
        CANCELLED("已取消"),    // 用户或系统取消
        RETURNED("已退货");     // 退货完成

        private final String description;

        Status(String description) {
            this.description = description;
        }

        public String getDescription() {
            return description;
        }

        // ✅ 静态方法:安全转换字符串到枚举(避免 NullPointerException)
        public static Status fromString(String str) {
            if (str == null) return null;
            for (Status s : values()) {
                if (s.name().equalsIgnoreCase(str)) {
                    return s;
                }
            }
            throw new IllegalArgumentException("未知订单状态:" + str);
        }
    }

    // ✅ 订单实体类
    private final String orderId;
    private Status status; // ✅ 使用内部枚举,类型安全,IDE 自动补全
    private LocalDateTime createdAt;

    public Order(String orderId) {
        this.orderId = orderId;
        this.status = Status.PENDING; // ✅ 默认状态
        this.createdAt = LocalDateTime.now();
    }

    // ✅ 状态变更方法(封装业务规则)
    public boolean canCancel() {
        return this.status == Status.PENDING || this.status == Status.PAID;
    }

    public void cancel() {
        if (!canCancel()) {
            throw new IllegalStateException("订单状态 " + status + " 不允许取消");
        }
        this.status = Status.CANCELLED;
        System.out.println("⛔ 订单 " + orderId + " 已取消");
    }

    public void markAsPaid() {
        if (this.status != Status.PENDING) {
            throw new IllegalStateException("仅待支付状态可支付");
        }
        this.status = Status.PAID;
        System.out.println("💰 订单 " + orderId + " 已支付");
    }

    // ✅ 获取状态描述(供 API 返回)
    public String getStatusDescription() {
        return this.status.getDescription();
    }

    // ✅ 使用示例
    public static void main(String[] args) {
        Order order = new Order("ORD-20251012-001");

        System.out.println("初始状态:" + order.getStatusDescription()); // 输出:待支付

        order.markAsPaid();
        System.out.println("当前状态:" + order.getStatusDescription()); // 输出:已支付

        order.cancel(); // ✅ 可取消
        System.out.println("最终状态:" + order.getStatusDescription()); // 输出:已取消

        // ✅ 外部使用内部枚举:必须通过 Order.Status 访问
        Order.Status status = Order.Status.DELIVERED;
        System.out.println("外部引用枚举:" + status.name()); // 输出:DELIVERED

        // ❌ 如果是外部枚举,可能被其他模块滥用(如 OrderStatus 与 PaymentStatus 混淆)
        // ✅ 内部枚举确保“状态”只属于“订单”这一上下文
    }
}

📌 使用场景:

  • 业务状态机:订单、工单、审批流、支付状态等
  • API 响应枚举:如 ResponseCode.SUCCESS, ResponseCode.INVALID_TOKEN
  • 避免命名冲突:多个模块都有“Status”枚举,用内部枚举隔离
  • 提升可读性:Order.Status.PAID 比 OrderStatus.PAID 更清晰表达归属

✅ 最佳实践:
凡是仅在一个类中使用的枚举,都应定义为内部枚举。
它们隐式为 static,不会增加内存负担,且语义清晰,是 Java 最优雅的“作用域封装”手段之一。


✅ 四、关键总结:何时推荐使用静态内部类与内部枚举?

类型推荐使用场景为什么推荐
静态内部类Builder 模式、工具类、配置类、回调处理器(无外部状态依赖)✅ 无外部引用,轻量、线程安全、可缓存、避免内存泄漏
内部枚举仅在单一类中使用的状态码、类型码、错误码✅ 作用域受限,避免全局污染,语义明确,IDE 支持好,类型安全

❌ 不要使用普通内部类 在以下场景:

  • 作为 Spring Bean(会被容器持有,导致外部类无法释放)
  • 存入静态缓存(如 Map<String, InnerClass>)
  • 在异步线程中传递(可能持有过期的外部对象)

✅ 优先使用静态内部类和内部枚举 —— 它们是 Java 中最安全、最高效、最符合面向对象封装原则的结构。


✅ 五、进阶建议:现代 Java 的替代方案

场景传统方式现代替代
构建复杂对象静态内部 Builder✅ record(JDK 14+)
状态枚举内部枚举✅ sealed interface + record(JDK 17+)
回调监听器普通内部类✅ Lambda 表达式(Runnable, Consumer)

例如,使用 record 重构上面的 DatabaseConfig:

// JDK 14+:record 自动提供构造器、getter、equals、hashCode、toString
public record DatabaseConfig(
    String url,
    String username,
    String password,
    int maxPoolSize,
    long connectionTimeout
) {
    public DatabaseConfig {
        if (url == null || url.isBlank()) {
            throw new IllegalArgumentException("URL 不能为空");
        }
        if (username == null || username.isBlank()) {
            throw new IllegalArgumentException("用户名不能为空");
        }
    }

    // ✅ 仍然可以定义静态工厂方法
    public static DatabaseConfig production() {
        return new DatabaseConfig(
            "jdbc:mysql://prod-db:3306/app",
            "prod_admin",
            System.getenv("DB_PASSWORD"),
            100,
            10000
        );
    }
}

💡 建议:在新项目中,优先使用 record 替代 Builder + 静态内部类,但理解静态内部类仍是阅读老代码和面试的必备技能。


✅ 总结:一句话记忆口诀

“普通内部类用回调,静态内部类做工具,内部枚举定状态,内存安全是王道。”

掌握这三者,你将能写出结构清晰、性能优异、不易出错的 Java 后端代码。
如需我为你讲解 匿名内部类、Lambda 与内部类的关系,或 Java 17+ sealed class 如何替代枚举

【第60题】必学的枚举1-枚举的定义和基本特性 枚举 阅读详情

相关推荐

手把手教你用RTD2775QT/RTD2795QT打造4K便携屏:从芯片选型到Type-C一线通实战

本文详细介绍了如何利用RTD2775QT和RTD2795QT显示驱动芯片打造4K便携屏的全过程,包括芯片选型、硬件设计、固件烧录及Type-C一线通实战方案。特别针对新手常见问题提供了解决方案,帮助读者高效完成DIY项目,提升移动办公体验。

weixin_42520025的博客 711

java内部类和枚举

文章目录内部类与枚举1、内部类2、静态内部类3、局部内部类4、匿名内部类5、lambda表达式枚举1、简单定义枚举类型 内部类与枚举 1、内部类 内部类不可以独立创建,需要穿件外部类以后,使用外部类实例来创建内部类(static除外) 2、静态内部类 static 内部类可以不用创建外部类 3、局部内部类 通常是在一个方法中定义一个类。局部内部类不能使用public 或者定义private 等来限定,作用于仅限于作用域内。局部内部类对外部类不可见。 4、匿名内部类 语法: new SuperType (Pa

爱喝星冰乐的博客 715

23.501中英对照(46):5QI到Qos特征的映射

注4:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为1毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注5:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为2毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注6:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为5毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注:建议为任何新的非GBR资源类型的标准化5QI分配小于64的值。

51学通信的博客 1294

Javase-内部类&枚举

内部类是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。当一个类的内部,包含一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。比如:汽车、的内部有发动机,发动机是包含在汽车内部的一个完整事物,可以把发动机设计成内部类。内部类有四种形式,分别是成员内部类、静态内部类、局部内部类、匿名内部类。

吃土的柚的博客 707

麒麟系统下的多媒体革命:VLC在kylinV10上的性能优化与调试技巧

本文详细介绍了在麒麟kylinV10系统上优化VLC多媒体播放性能的实战技巧,特别针对飞腾FT-2000/4硬件平台。从源码编译调优到硬件加速配置,提供全面的性能提升方案,帮助开发者在国产操作系统上构建高效媒体播放环境。

weixin_29168675的博客 457

Blender建模:对于模型布线的一些思考

Blender布线中一些问题的总结和思考,主要讲述原理和解决方法。

baidu_38797690的博客 1821

java 枚举类型enum的用法详解

java 枚举类型enum的用法详解

qianbihua00的博客 7197

WPS Office 2026免费安装指南:AI办公与安全使用全解析

办公软件作为数字化办公的核心工具,其基本原理是通过文档处理、数据计算和演示展示等功能模块满足用户日常办公需求。随着人工智能技术的发展,现代办公软件逐步集成AI能力,通过自然语言处理和数据分析算法提升工作效率。在技术价值层面,优秀的办公软件不仅需要保持格式兼容性和跨平台同步能力,更要注重用户数据安全防护。从应用场景来看,无论是个人文档编辑、企业报表分析还是团队协作演示,办公软件都发挥着关键作用。WPS Office 2026作为国产办公软件代表,深度融合AI助手功能,支持智能写作和数据分析,同时通过官方免费策

weixin_30599769的博客 704

Java 中的 内部类和枚举类

匿名内部类、成员内部类、静态内部类、局部内部类、Lambda表达式

m0_73976305的博客 341

SPH vs Lagrange网格混合建模实战:用LS-DYNA模拟弹丸穿孔效应

本文深入探讨了在LS-DYNA中运用SPH与Lagrange网格混合建模技术,高效模拟超高速碰撞下弹丸穿孔效应的实战方法。通过分析模型分区策略、耦合界面处理及关键参数设置,解决了传统方法在模拟大变形、材料断裂时的网格畸变或计算成本高昂问题,为相关工程仿真提供了兼顾精度与效率的解决方案。

weixin_29211309的博客 108

ArduPilot + Gazebo + Mavros + QGC + 遥控器:从仿真到实机的自主轨迹控制实践

本文详细介绍了基于ArduPilot、Gazebo、Mavros和QGC的无人机自主轨迹控制全流程实践。从仿真环境搭建、多终端协同配置,到遥控器集成与自主圆形轨迹算法实现,提供了完整的代码示例和实机迁移要点,帮助开发者快速掌握无人机自主控制技术。

corn8的博客 940

java枚举类详解

枚举类基础

weixin_43604021的博客 3836

RK3576 调试ov2735 mipi-csi摄像头

摘要:本文记录了基于RK3576平台调试OV2735 MIPI摄像头的全过程。开发环境采用Linux 6.1内核和Buildroot文件系统。调试步骤包括:1)硬件检查(电源、晶振和引脚连接);2)驱动配置(设备树节点、ISP通道设置);3)驱动验证(通过ID检测和I2C工具测试);4)推流测试(使用v4l2和gstreamer工具)。重点解决了复位引脚配置、时钟命名匹配等关键问题,并通过寄存器检查确保初始化正常。最终实现了摄像头数据流的成功输出,为嵌入式视觉应用开发提供了完整参考方案。

qq_45147279的博客 1060

实验九 内部类、lambda、枚举类和异常处理学习

实验目的: 掌握内部类,拉姆达的使用。 掌握匿名内部类的使用 掌握枚举类的定义和使用 掌握异常处理 实验内容: 可比接口和比较器接口学习 创建一个班级枚举类级,内部有四个对象大一,大二,大三,大四; 设计一个学生类,包括私有数据成员:字符串成员的名字,等级数据成员级,双数据成员的分数;公有函数:带参数构造函数,成员变量的访问器,重写的的toString函数(返回姓名,班级和成绩)。该类...

kanghongyun的博客 393

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java文件编译后额外生成的$1.class、主类$内部类名.class

可以将一个类的定义放在另一个类的内部,这就是内部类。我们一般将内部类分为四种:成员内部类静态内部类局部(方法内部类)匿名内部类。外部类的定义是相对于内部类而言的。(具体知识参考文章Java内部类(静态内部类、匿名内部类等)详解-优快云博客是由于嵌套枚举类型的存在而生成的。是编译器为优化switch语句中的枚举操作而生成的合成类,用于初始化静态映射表。多出来的两个文件是编译器优化的结果,反编译器会尝试将其解释为某种静态映射表或独立类。

2301_79368381的博客 1654

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

抽象类,接口,内部类,

抽象类使用abstract关键字修饰,抽象方法也是使用abstract修饰,抽象方法没有方法体。接口是一种引用数据类型,是用interface关键字修饰,它是一种功能的实现。接口中没有构造器,不能实例化对象,符合多态机制。1.在接口中的变量,默认被public static final修饰,是公共静态常量。2.接口中的方法,默认被public abstract修饰,是抽象方法。3.JDK8之后,接口中可以有静态和默认方法。(静态方法只能使用接口名去调用,默认方法在实现接口的子类还可以被重写)

qq_64004825的博客 864

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java 中 Holder 方式 和 枚举方式 实现单例模式

Holder 方式 和 枚举方式可以线程安全的实现单例模式。 Holder 方式借助于类加载的初始化阶段<clinit>()方法是同步方法。 枚举方式是因为枚举类型不能继承且只能被实例化一次。 1.Holder 方式实现单例模式 类加载的初始化阶段<clinit>()方法是同步方法,在类中设置一个静态类,将唯一实例放在静态类中,第一次访问实例...

学习笔记 4250

从零开始深入理解Java枚举

这一篇内容有点多,但是肯定会很有帮助,很多内容来自《Java核心技术》和《Effective Java》(刚学Java的时候,这本中文版的书非常不建议阅读,本来就不是很好理解,加上令人崩溃的翻译,但是主要内容都写在了这篇最后一章)另外还参考了《Java学习笔记》(这本书虽然没那么出名,但是读起来很容易理解,非常适合入门)还有一些其他资料就不说了,最后就是自己的一些理解。后面部分很多代码都没有使用idea,所以可能一点点会有笔误,当做是个学习笔记好了。

成都往右的博客 1188

枚举类的意义_深入理解Java枚举

所有知识体系文章,[GitHub](https://github.com/Ziphtracks/JavaLearningmanual)已收录,欢迎Star!再次感谢,愿你早日进入大厂!https://github.com/Ziphtracks/JavaLearningmanual​github.com一、什么是枚举1.1 什么是枚举?至于枚举,我们先拿生活中的枚举来入手,然后再引申Java中的枚举...

weixin_39613540的博客 1429

Java –比较枚举值

在Java中,可以使用==运算符比较Enum值。 1. Java枚举示例 语言.java package com.mkyong.java public enum Language { JAVA, PYTHON, NODE, NET, RUBY } 2.与==比较 将枚举值与==运算符进行比较的示例。 Test.java pa...

一名可爱的技术搬运工 3510

夯实Java基础系列14:深入理解Java枚举类

本文介绍了枚举类的基本概念,使用方法,以及底层实现原理。帮助你更好地使用枚举类并且理解枚举类的内部实现细节。 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 喜欢的话麻烦点一下星哈谢谢。 文章首发于我的个人博客: https://h2pl.github.io/2018/05/02/javase15 更多关于Java后端...

Java技术江湖 3879

java 枚举_深入理解Java枚举

所有知识体系文章,[GitHub](https://github.com/Ziphtracks/JavaLearningmanual)已收录,欢迎Star!再次感谢,愿你早日进入大厂!https://github.com/Ziphtracks/JavaLearningmanual​github.com一、什么是枚举1.1 什么是枚举?至于枚举,我们先拿生活中的枚举来入手,然后再引申Java中的枚举...

weixin_39836530的博客 93

深度学习Java枚举(enum)——枚举虽小,五脏俱全

问问自己当面试官问你枚举相关的时候,你会了解多少?——枚举虽小,五脏俱全!

奈何的人生 3859

【hacker送书第6期】深入理解Java核心技术

【hacker送书第6期】深入理解Java核心技术,欢迎大家参与

hacker707的博客 1万+

Java基础15:深入理解Java枚举类

Java基础15:深入理解Java枚举类 (本文参考了https://blog.youkuaiyun.com/a724888/article/details/80173457 )   枚举(enum)类型是Java 5新增的特性,存放在 java.lang 包中,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。 引入枚举类   在程序设计中,有时会用到由若干个有限数据元素组...

weixin_43192732的博客 374

java枚举 取值_秒懂系列,超详细Java枚举教程!!!

深入理解Java枚举一、什么是枚举1.1 什么是枚举?至于枚举,我们先拿生活中的枚举来入手,然后再引申Java中的枚举,其实它们的意义很相似。谈到生活中的枚举,假如我们在玩掷骰子的游戏,在我们手中有两个骰子,要求掷出两个骰子的点数和必须大于6的概率,那么在此情此景,我们就需要使用枚举法一一列举出骰子点数的所有可能,然后根据列举出来的可能,求出概率。可能有的小伙伴发现,这就是数学啊?这就是数学中的概...

weixin_39600319的博客 5077
上一篇: JDK 常用工具类系统分类与实战示例
下一篇: Java 关键字系统分类与实战详解
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值