JavaSE基础篇:枚举

news/2025/1/11 11:34:37/

文章部分内容整理自知乎Peter McLeish的回答

  • 第一章:枚举类
    • 一:自定义一个枚举类
    • 二:JDK提供的枚举类型
    • 三:枚举中静态代码块的执行顺序

第一章:枚举类

枚举类:类的对象只有有限个,且是确定的

Java枚举型是静态常量,隐式地用static final修饰过,这里面包含了两层意思:
1:举型中的实例隐式地用public static final修饰过
2:枚举型作为某个类中的成员字段也隐式地用 static final修饰过

私有化类的构造器,保证不能在类的外部创建其对象在类的内部创建枚举类的实例

一:自定义一个枚举类

如何定义枚举类?方式一:JDK5.0之前,自定义枚举类步骤:私有化类的构造器,保证不能在类的外部创建其对象在类的内部创建枚举类的实例。声明为:public static final对象如果有实例变量,应该声明为private final,并且在构造器中初始化实例:

public class SeasonTest {public static void main(String[] args) {Season spring = Season.SPRING;System.out.println(spring)}}//自定义枚举类
class Season {//1.声明Season对象的属性:private final修饰private final String seasonName;private final String seasonDesc;//2.私有化类的构造器,并给对象属性赋值private Season(String seasonName, String seasonDesc) {this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//3.提供当前枚举类的多个对象:public static final的public static final Season SPRING = new Season("春天", "Spring");public static final Season SUMMER = new Season("夏天", "Summer");public static final Season AUTUMN = new Season("秋天", "Autumn");public static final Season WINTER = new Season("冬天", "Winter");//4.其他诉求1:获取枚举类对象的属性public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//4.其他诉求2:提供toString()@Overridepublic String toString() {return "Season{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
}

二:JDK提供的枚举类型

JDK5.0及其以后,可以使用enum关键字定义枚举类步骤:使用enum关键字定义枚举类声明对象属性,使用private final修饰私有化类的构造器,并给对象属性赋值提供当前枚举类的对象,多个对象之间用","隔开,末尾对象;结束

public class SeasonTest1 {public static void main(String[] args) {Season1 summer = Season1.SUMMER;System.out.println(summer);System.out.println("**********************");Season1[] values = Season1.values();for (int i = 0; i < values.length; i++) {System.out.println(values[i]);values[i].show();}Season1 winter = Season1.valueOf("WINTER");System.out.println(winter);winter.show();}
}interface Info {void show();
}//使用enum关键字
enum Season1 implements Info {//3.提供当前枚举类的对象,多个对象之间用“,”隔开,末尾对象;结束SPRING("春天", "Spring") {@Overridepublic void show() {System.out.println("where arr you");}},SUMMER("夏天", "Summer") {@Overridepublic void show() {System.out.println("i miss you");}},AUTUMN("秋天", "Autumn") {@Overridepublic void show() {System.out.println("i want to be with you");}},WINTER("冬天", "Winter") {@Overridepublic void show() {System.out.println("i want you");}};//1.声明Season对象的属性:private final修饰private final String seasonName;private final String seasonDesc;//2.私有化类的构造器,并给对象属性赋值private Season1(String seasonName, String seasonDesc) {this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//4.其他诉求1:获取枚举类对象的属性public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//4.其他诉求2:提供toString()@Overridepublic String toString() {return "Season1{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}/*  @Overridepublic void show() {System.out.println("this is a season");}*/
}

enum类中的常用方法:values():返回枚举类型的对象数组。该方法可以方便地遍历所有的枚举值valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。toString():返回当前枚举类对象常量的名称enum使用说明:使用enum定义的枚举类默认继承了java.lang.Enum类,因此不能再继承其他类枚举类的构造器只能使用private权限修饰符必须在枚举类的第一行声明枚举类对象

三:枚举中静态代码块的执行顺序

package com.dashu.nettytest;import java.util.HashMap;
import java.util.Map;public enum FruitEnum {APPLE("苹果","红色","酸甜可口"),BANANA("香蕉","黄色","软糯香甜"),Orange("橘子","黄色","酸酸甜甜");private static final Map<String,FruitEnum> map = new HashMap<>();static {System.out.println("static。。。。。。。。。。。111");map.put("苹果",APPLE);map.put("香蕉",BANANA);map.put("橘子",Orange);System.out.println("static。。。。。。。。。。。222");}private String name;private String color;private String taste;{System.out.println("成员代码块");}private FruitEnum(String name,String color,String taste){this.name = name;this.color = color;this.taste = taste;System.out.println("构造方法");}}class shit {public static void main(String[] args) {FruitEnum apple = FruitEnum.APPLE;//成员代码块//构造方法//成员代码块//构造方法//成员代码块//构造方法//static。。。。。。。。。。。111//static。。。。。。。。。。。222}
}

枚举中都是static修饰的,类加载的时候就会将静态内容加载到JVM当中,静态内容也会按照顺序进行执行,但是执行到枚举中静态实例的会后就会触发构造法和成员代码块去创建对象。这样的话就会产生一种错觉,static修饰的代码块执行靠后了。


http://www.ppmy.cn/news/6223.html

相关文章

DaVinci:曲线之 HSL 曲线

调色页面&#xff1a;曲线Color&#xff1a;CurvesH 指的是色相 Hue&#xff0c;S 指的是饱和度 Saturation&#xff0c;L 指的是亮度 Luminance。DaVinci Resolve 的曲线调板中&#xff0c;除了自定义曲线&#xff0c;还提供了六种基于色相、饱和度或亮度的调节曲线&#xff0…

图(Graph)的定义

图(Graph)的定义 文章目录图(Graph)的定义●图的形式化定义:G (V,E)●无向图和有向图的表示形式:● 有向图和无向图的定义●抽象数据类型定义ADT●图形结构属于复杂的非线性结构● 图由顶点的集合和边的集合构成 ●图的形式化定义:G (V,E) • 集合V(vertex):顶点的有限集合,…

【网络安全】浅识 SQL 注入

前言 SQL 注入&#xff08;SQL Injection&#xff09;是发生在 Web 程序中数据库层的安全漏洞&#xff0c;是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理&#xff0c;导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外…

我写这10+个JavaScript单行代码,被组长夸代码写得优雅!

大厂面试题分享 面试题库 前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 JavaScript 非常大的特点容易上手且非常灵活&#xff0c;代码实现方式五花八门&#xff1b;有时候能一行代码解决&#xff0c;就尽量不用…

C# Winform 三层架构

一、介绍 三层架构是 C# 桌面开发中比较常用的框架&#xff0c;是由 表示层&#xff08;UI&#xff09;、业务逻辑层&#xff08;BLL&#xff09;和数据访问层&#xff08;DAL&#xff09;三层架构组成&#xff0c;目的是为了 “高内聚&#xff0c;低耦合”。开发人员分工更明…

【并发】深入理解JMM并发三大特性(一)

【并发】深入理解JMM&并发三大特性&#xff08;一&#xff09; 今天是2022.11.16&#xff0c;在此之前我已经学习完了图灵课堂MySQL的课程&#xff0c;也是想这篇文章一样用CSDN博客的形式来记录这些知识点。 在并发中&#xff0c;JMM在大多数人眼中&#xff0c;它是整个…

java中的反射

反射 类加载的过程 当程序主动使用某个类时&#xff0c;如果该类还未被加载到内存中&#xff0c;则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外&#xff0c;JVM将会连续完成3个步骤&#xff0c;所以有时也把这个3个步骤统称为类加载或类初始化。加载 …

从 2022 年优秀 Linux 发行版中挑选你喜欢的版本

导读如果你想从 2022 年最佳 Linux 发行版列表中挑选一个最喜欢的版本&#xff0c;那么今天你需要考虑以下几个选项。 2022 年是充满惊喜的一年&#xff0c;Linux 发行版的表现也不例外。从充满功能的新版本到各种桌面选项&#xff0c;总有一些值得期待的东西。 如果你想从 20…