Java基础巩固-枚举的使用

简介: 枚举:jdk1.5引入的新特性,允许用常量表示特定的数据片段,且全一类型安全的形式来表示。常用的定义常量方式public static final xxx .

枚举:jdk1.5引入的新特性,允许用常量表示特定的数据片段,且全一类型安全的形式来表示。

常用的定义常量方式

public static final xxx ...例如:

public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FALL = 3;
public static final int SEASON_WINTER = 4;

使用常量的缺点

1.类型不安全,若一个方法要求传入季节参数。

public Object getSeasonXXX(int seasonType) {
    ...
    return xxx;
}
//如果这个时候要调用getSeasonXXX根据传入的天气获取天气的一些相关属性,用常量的话,形参就是int类型,这个时候getSeasonXXX(SEASON_WINTER)和getSeasonXXX(4)都能获取冬天的天气属性,那么getSeasonXXX(5)也能编译过去而不会警告,但这样就不安全了。

2.没有命名空间。开发者要在命名的时候以SEASON_开头,另外一个开发者再看这段代码的时候,才知道这四个常量分别代表季节。

3.如果定义int值相同的变量,容易造成混淆。

使用枚举类

这个时候尝试利用枚举来定义常量,写个最简单的例子,例如

public enum SeasonEnum {
    SPRING,SUMMER,FALL,WINTER;
}

将该类的编译后的class文件 javap(对编译的文件进行反编译)一下,可以看到类型默认继承java.lang.Enum


img_fd1366dfb43b7f4e3b9bd32dbc1428f3.png
简单用法
public class testEnum1 {
    enum EnumW {
        SPRING,SUMMER,FALL,WINTER;
    }
    public static void main(String[] args) {
        EnumW enumW = EnumW.SPRING;
        System.out.println(enumW); //输出SPRING 
         System.out.println(enumW); //输出SPRING
         if (enumW.equals(enumW.toString())) { //这边不会输出相同 因为enumW不是String类型 但是有equals、toString()方法
            System.out.println("相同");
        }
    }
}
枚举类也可以定义属性和方法,例如
public class testEnum2 {
    enum EnumW {
        SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");//枚举类的实例必须放在第一行,如果放在下面编译会报错
        private final String name;
        private EnumW(String name) {//枚举类的构造器只能是私有的 这边改为public编译会有警告(可以自定义多个参数然后再get获取多个属性)
            this.name = name;
        }
        public String getName() {
            return name;
        }
    }
    public static void main(String[] args) {
        EnumW enumW = EnumW.SPRING;
        System.out.println(enumW.getName());//春天
    }
}

从上述例子可以看出枚举类的几个特点

  1. enum和class、interface的地位一样

  2. 使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。

  3. 枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。

  4. 使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承,又因为继承了Enum类不能再继承其它类。

  5. 枚举类的构造器只能是私有的。

枚举类的常用用法

1.可以在switch case语句中直接使用枚举值,不需加入枚举类作为限定,使代码更加优雅
public class testEnum3 {
    enum EnumW {
        SPRING,SUMMER,FALL,WINTER;
    }
     public void judge(EnumW s)
        {
            switch(s)
            {
            case SPRING: //直接使用枚举值做限定
                System.out.println("春天适合踏青。");
                break;
            case SUMMER:
                System.out.println("夏天要去游泳啦。");
                break;
            case FALL:
                System.out.println("秋天一定要去旅游哦。");
                break;
            case WINTER:
                System.out.println("冬天要是下雪就好啦。");
                break;
            }
        }
        
        public static void main(String[] args) {
            EnumW enumw = EnumW.SPRING; 
            testEnum testEnum = new testEnum();
            testEnum.judge(enumw);//春天适合踏青。
        }
}

思考

1.枚举类是否可以定义抽象方法

首先有抽象方法的类必然是抽象类,但是根据上面的反编译的类由final修饰而不是抽象类,但是枚举类又可以定义抽象方法,这是为什么呢。

首先编写这么一段代码

public enum AbstractTest {
    Spring {
        @Override
        public AbstractTest getSeason() {
            return Spring;
        }
    },
    Summer {
        @Override
        public AbstractTest getSeason() {
            return Summer;
        }
    },
    FALL {
        @Override
        public AbstractTest getSeason() {
            return FALL;
        }
    },
    WINTER {
        @Override
        public AbstractTest getSeason() {
            return WINTER;
        }
    };
    public abstract AbstractTest getSeason();

    public static void main(String[] args) {
        System.out.println(AbstractTest.Spring.toString());//Spring
    }
}
img_d1c5cc00353f3bf1accc76f88e4ca6ad.png
查看编译后的文件

javac AbstractTest.java
将java文件编译为class文件,会生成4个从1开始包含$+数字的class文件(匿名内部类)和一个主类(枚举类),这四个类继承了主类从而通过子类来实现抽象方法


img_9db9cbc87a9c515c0044cbece50933a4.png
所以枚举类是可以带有抽象方法的,含有抽象方法的枚举类将自动修饰abstract并通过内部类来实现。
目录
相关文章
|
7天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
96 60
|
24天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
57 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
5月前
|
Java
【Java基础】输入输出流(IO流)
Java基础、输入输出流、IO流、流的概念、输入输出流的类层次结构图、使用 InputStream 和 OutputStream流类、使用 Reader 和 Writer 流类
162 2
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
58 9
Java——反射&枚举
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
77 5
|
2月前
|
安全 Java 开发者
Java 枚举(enum)详解
Java 中的枚举(`enum`)是一种特殊的数据类型,用于定义一组固定的常量,提升代码的类型安全性和可读性。枚举使用 `enum` 关键字定义,支持方法和构造函数,具有类型安全、单例、自动序列化等特点,并且可以遍历和用于 `switch` 语句中。实际应用包括状态机、指令集、类型标识等场景。枚举使代码更加清晰易维护。
|
3月前
|
Java
Java枚举使用的基本案例
这篇文章是关于Java枚举的基本使用,通过一个指令下发的代码案例,展示了如何定义枚举、使用枚举以及如何通过枚举实现指令的匹配和处理。
|
3月前
|
Java 开发者
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案。本文通过技术综述及示例代码,剖析两者在性能上的差异。if-else具有短路特性,但条件增多时JVM会优化提升性能;switch则利用跳转表机制,在处理大量固定选项时表现出色。通过实验对比可见,switch在重复case值处理上通常更快。尽管如此,选择时还需兼顾代码的可读性和维护性。理解这些细节有助于开发者编写出既高效又优雅的Java代码。
47 2
|
3月前
|
安全 Java 编译器