开发者社区> garwer> 正文

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并通过内部类来实现。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Struts,你为何死不悔改!
上篇文章《诡异的字符串问题。。。》的问题已经解决了,我一直相信「团队力量的重要性」,虽然我不能保证加入群的每一个人都是乐于分享的同学,但我始终群里的各位同学总会慢慢被我们这种乐于分享的群氛围所影响。就以上篇文章为例,群里的 Univechige 同学专门给 IntelliJ IDEA 官方发邮件寻求原因,这便是一个好的开端,我相信有各位同学的共同维护,后面群氛围会越来越好。下面给出 IDEA 官方的答复,见下图。
5 0
文件找不到!
谈文件异常前,先要给各位复习一下磁盘 IO 的知识,说到 IO,就不得不提一下计算机的存储系统体系,主要分为 CPU、内存、磁盘,而磁盘又分为机械磁盘和固态硬盘。一般来说,离 CPU 越近,价格越贵,速度越快,容量越小;反之,离 CPU 越远,价格越便宜,速度越慢,容量越大,见下图。
4 0
JDK 11 是发布了,但收费吗?
自 9 月 26 日,Oracle JDK 11 正式版本发布以来,一直被大家所看好,因为它是继 6、7、8之后,第一个长期支持的版本「见下图」,而 9 、10 估计多半会夭折了。。。
4 0
Maven 仓库介绍 和 nexus 私服搭建
Maven 仓库 在 Maven 的术语中,仓库是一个位置(place)。 Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。 在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。 Maven 仓库能帮助我们管理构件(主要是 JAR ),它就是放置所有 JAR 文件(WAR,ZIP,POM 等)的地方。
6 0
【EL与JSTL表达式】学习JSP之后,这是你不得不知道的技术
之前我们已经完成了对JSP的学习,但是还有一些其他的东西我们必须得知道,今天我们来学习EL与JSTL表达式。它们将简化JSP的书写并且使得JSP更加强大。但是如果你对JSP一无所知的话建议你先去看一下之前入门JSP的文章。
7 0
这三个网站的使用技巧,你值得收藏。。。
最近,微信群里有小伙伴叫我分享几个自己经常访问的技术网站,就在这篇文章给大家总结一下。
5 0
Android Studio快捷键以及使用技巧
Android Studio快捷键以及使用技巧
4 0
想要漂亮的效果,怎么能少了粒子插件
嗨!大家好,我是小蚂蚁,今天我们来分享一下微信小游戏制作工具中的关于粒子插件的使用,粒子插件能够帮助我们在游戏中创建各种漂亮的效果,例如爆炸,果汁四溅,漂亮的焰火等等。
3 0
怎么读 Tomcat 源码?
上次分享了一篇关于 Tomcat 的文章《写一款 Tomcat 也没有那么难》,真有读者去下载了 Tomcat 的源码来研读,但搞了很久也没有把它在 IDEA 的开发环境给成功跑起来。
4 0
如何给你的小游戏起个好名字
嗨!大家好,我是小蚂蚁。今天的这篇文章来自于我的一位学员 @Sing 的分享。很多的小游戏开发者给自己的游戏起名字完全是随性或者凭借感觉,其实给小游戏起名字是有一定的方法的,一个好的名字是能给你的小游戏带来一定的搜索自然流量的。
7 0
+关注
garwer
me.garwer.cn
22
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载