进阶JAVA篇-深入了解枚举与抽象枚举

这篇具有很好参考价值的文章主要介绍了进阶JAVA篇-深入了解枚举与抽象枚举。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

      介绍一下枚举:

          1.1枚举的概念

          1.2具体如何来使用呢?

          1.3对枚举小结

          1.4抽象枚举概念

          1.5对抽象枚举小结


                介绍一下枚举:

        1.1枚举的概念

        在JAVA中,枚举是一种特殊的类,用于定义一组常量。Java中的枚举类型是通过使用关键字"enum"来定义的。枚举类中的第一行只能写一些合法的标识符(名称),多个名称需要逗号相隔开来,这些名称本质是常量,每个常量都会记住一个枚举类的对象。枚举类里面除了第一行的常量之外,其余跟一般的类所具有的成员(变量、方法、构造器、代码块、内部类)都有具有。

代码如下:

public class Text {
    public static void main(String[] args) {

    }

}

enum EnumerateClasses{
    X,Y,Z;

    private String name;
    private int age;

    public void fun(){
        System.out.println("调用枚举类中的方法");
    }

    EnumerateClasses() {
    }

    EnumerateClasses(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

         接下来我们反汇编来观察枚举类,深入枚举内部了解一下:

        进阶JAVA篇-深入了解枚举与抽象枚举,java,开发语言

        先来看第一个“红框”用关键字final来修饰一个枚举类,所以枚举类是不可以被别的类所继承的,枚举类是最终类。再来看第二个“大红框”,编写的第一行的符号(名称),之所以被称为常量,这样就一清二楚了,是因为用static final 来修饰所编写的名称,还有一个要注意的是,这些名称的类型是一个类!!!因此可以这样说枚举类的第一行必须罗列的是枚举对象的名称。

        还有一点注意,通过反汇编观察到,枚举类中无论是无参构造器还是有参构造器中都默认为私有的(private)来修饰构造器,所以枚举是不可以在枚举外部new创建对象的,只能在内部。其实枚举就是一个只能在自己内部定义自己的对象。

如下:

进阶JAVA篇-深入了解枚举与抽象枚举,java,开发语言

         1.2具体如何来使用呢?

代码如下:

public class Enum {
    public static void main(String[] args) {
        EnumerateClasses enumerateClasses = EnumerateClasses.X;
        enumerateClasses.fun();

        System.out.println(enumerateClasses.getName());
        System.out.println(enumerateClasses.getAge());
    }
}
enum EnumerateClasses{
    X("lisi",12),Y,Z;

    private String name;
    private int age;

    public void fun(){
        System.out.println("调用枚举类中的方法");
    }

    EnumerateClasses() {
    }

    EnumerateClasses(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

        对以上代码进行分析,首先先在枚举内初始化 X("lisi","12") 这个方式就是在用私有的有参数的构造器创建对象,因为这个对象是用static final修饰的,该对象将成为类的静态常量,所以可以用枚举名.对象,然后用枚举类型的变量来接收,接着就可以用这个变量名去访问公开的成员了。

 编译器中为枚举新增加了几个方法,下面来展示一下:

public class Enum {
    public static void main(String[] args) {
        EnumerateClasses enumerateClasses = EnumerateClasses.X;
        enumerateClasses.fun();

        System.out.println(enumerateClasses.getName());
        System.out.println(enumerateClasses.getAge());

        //该方法可以得到全部对象,并且放到一个数组中
        EnumerateClasses[] e = EnumerateClasses.values();
        for (int i = 0; i < e.length; i++) {
            EnumerateClasses j = e[i];
            System.out.print(j.getName()+" ");
            System.out.println(j.getAge());
        }

        System.out.println("-----------------------------------------");
        //该方法可以得到指定的对象
        EnumerateClasses name = EnumerateClasses.valueOf("X");
        System.out.print(name.getName() + " ");
        System.out.println(name.getAge());
        //该方法可以得到该对象对应的索引
        System.out.println(name.ordinal());
    }
}
enum EnumerateClasses{
    X("李四",12),Y("王五",22),Z("张三",33);

    private String name;
    private int age;

    public void fun(){
        System.out.println("调用枚举类中的方法");
    }

    EnumerateClasses() {
    }

    EnumerateClasses(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

        1.3对枚举小结:

        第一行定义的是常量,用合法字符来表示,每一个字符都会对应一个对象,该对象是类的静态常量,可以直接被类访问。枚举不能被继承,也不能去new对象,只能在枚举内部创建对象。了解了三个编译器为枚举新增的方法,分别可以得到全部对象,可以得到指定的对象,可以查找该对象的索引。

        1.4抽象枚举概念

        抽象枚举相比与普通的枚举,就是在枚举内部有抽象方法,需要重写抽象方法,才能够在枚举里面创建对象。

代码如下:

public class Text {
    public static void main(String[] args) {
        E e1 = E.CAT;
        E e2 = E.DOG;

        e1.go();
        e2.go();
    }
}
enum E {
    CAT("小猫"){
        @Override
        public void go() {
            System.out.println(getName()+"优雅地走");
        }
    },DOG("傻狗"){
        @Override
        public void go() {
            System.out.println(getName()+"狂跑");
        }
    };

    private String name;
    public abstract void go();

    E(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

        对以上代码简单分析一下,首先枚举里面有一个有参数的构造器,只能用这个构造器来创建对象了,发现枚举里面还有一个抽象方法,如果没有重写这个方法是不能创建对象的,所以在创建对象的时候需要重写方法,这个方式跟匿名内部类很相识的,需要区别开来。重写完方法后,就可以创建对象了,用E的类型变量去接收这些对象。

反编译观察CAT这个类:

进阶JAVA篇-深入了解枚举与抽象枚举,java,开发语言

       1.5对抽象枚举小结

        枚举如果有定义抽象方法的话,这个就是抽象枚举了。如果这时候创建对象的时候没有去抽象方法进行重写,创建对象就会失败。文章来源地址https://www.toymoban.com/news/detail-728156.html



到了这里,关于进阶JAVA篇-深入了解枚举与抽象枚举的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java系列】深入解析枚举类型

    即便平凡的日子仿佛毫无波澜,但在某个特定的时刻,执着的努力便会显现出它的价值和意义。 希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流 思考一下这寄个问题,我们将围绕这三个问题来开始学习: 什么是枚举 怎么

    2024年02月06日
    浏览(31)
  • 【C语言进阶日记】算法篇① 深入了解常用十二种滤波算法:原理、示例与应用

    提示:滤波算法在信号处理和图像处理领域中广泛应用,可以用于去噪、平滑、增强和分析信号。本文将深入介绍滤波算法的原理和常见的应用,帮助读者更好地理解和使用滤波算法。 滤波算法是一种数学技术,用于处理信号的频谱特性。通过对信号的时域或频域进行变换、

    2024年02月05日
    浏览(42)
  • Java 基础进阶篇(三)—— 权限修饰符、final 关键字与枚举

    权限修饰符 用于约束成员变量、构造器、方法等的访问范围。 权限修饰符: 有四种作用范围由小到大 (private - 缺省 -protected - public) 注: 不同包下的子类指的是,不同包下的子类对象能访问,当前类创建父类对象访问不了。 定义成员变量、构造器、方法等一般需满足如下要

    2024年02月02日
    浏览(62)
  • 鸿蒙开发:深入了解Arkts语言中的Want对象及其运用

    Arkts语言中的 Want 是一种用于对象间信息传递的载体,主要用于应用组件之间的信息传递。本文将深入探讨 Want 的定义、用途、类型以及参数说明

    2024年02月04日
    浏览(43)
  • Java语言----反射、枚举以及lambda表达式

    目录 一.反射 1.1反射的基本情况 1.2反射中最重要的类 1.2.1 Class类 1.2.2Field类 1.2.3Constructor类 1.2.4Method类 1.3反射优缺点  二.枚举 2.1概念 2.2枚举(enum)类方法 2.3枚举的构造 三.Lambda表达式 3.1Lambda介绍 3.2 函数式接口 3.3使用lambda表达式 3.2.1不使用Lambda表达式调用 3.2.2使用Lambda表

    2024年02月08日
    浏览(47)
  • 深入了解 Java Spring 框架

            Java Spring 是一个强大而受欢迎的开源框架,用于构建企业级Java应用程序。它提供了丰富的功能和模块,使开发者能够快速搭建可扩展、高效和可维护的应用。本文将深入探讨Java Spring框架的核心特性和优势,以及如何利用它构建优秀的应用程序。         Jav

    2024年02月09日
    浏览(47)
  • 【Java 基础篇】Java反射:深入了解Class对象

    Java是一门强类型语言,它要求在编译时知道所有的类和对象类型。然而,有时候我们需要在运行时动态地获取和操作类的信息,这就是Java反射的用武之地。本文将深入探讨Java反射,特别是与Class对象相关的内容。 反射是一种机制,允许我们在运行时检查、获取和操作类的信

    2024年02月06日
    浏览(48)
  • 【Java 进阶篇】用JSTL玩转Java:了解JSTL常用标签

    JavaServer Pages标准标签库(JavaServer Pages Standard Tag Library,简称JSTL)是Java Web应用程序中常用的标签库之一。它提供了一组标签,使得在JSP页面中处理数据、控制流程、以及显示内容变得更加便捷和高效。本文将带领你深入了解JSTL的常用标签,无论你是初学者还是有一定经验的

    2024年02月21日
    浏览(41)
  • 鸿蒙开发:深入了解Arkts语言中的Want对象及其运用【鸿蒙专栏-23】

    Arkts语言中的 Want 是一种用于对象间信息传递的载体,主要用于应用组件之间的信息传递。本文将深入探讨 Want 的定义、用途、类型以及参数说明

    2024年02月05日
    浏览(56)
  • 高阶JAVA篇-深入了解字符集

    🔥博客主页:  小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍     文章目录        1.0 字符集的说明         1.1 ASCII  字符集         1.2 GBK 字符集         1.3 UTF-8字符集         2.0 字符集的编码与解码         2.1 编码提供了常见的方法         2.2 解码提供了常

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包