进阶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;
    }
}

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

        

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

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

如下:

         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这个类:

       1.5对抽象枚举小结

        枚举如果有定义抽象方法的话,这个就是抽象枚举了。如果这时候创建对象的时候没有去抽象方法进行重写,创建对象就会失败。



  • 26
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
### 回答1: 枚举是一种特殊的数据类型,它可以定义一组常量,这些常量在程序中是固定不变的。枚举常量可以用于代表一些特定的状态或类型,比如星期几、颜色、性别等。在Java中,枚举类型是通过关键字enum来定义的。枚举类型的常量可以通过枚举类型名和常量名来访问,例如:Weekday.MONDAY。枚举类型还可以定义方法和构造函数,以便更好地描述枚举常量的特性和行为。枚举类型在Java中广泛应用于各种场景,例如状态机、配置管理、错误码等。 ### 回答2: 枚举(Enumeration)在Java中是一种特殊的数据类型,它是一组有限且已命名的数据项的集合。枚举类型属于引用数据类型,它的每一个成员都是一个常量对象,且不能改变,可以看作一个常量的集合。 枚举类型的定义格式如下: enum 枚举类型名称{ 枚举值1, 枚举值2, …… 枚举值N; } 其中,枚举常量就是指定义在枚举类型中的数据项,每个枚举常量都有一个唯一的名称,并且是用常量大写字母来表示的。我们可以使用枚举类型定义变量,枚举类型变量赋值的时候只能取枚举类型中的某一个值,不能赋值其他类型的值。 枚举类型的最大优点就在于其具备范围固定、安全性高、易于理解的特点。在处理程序中,为了避免输入的数据不符合要求或程序出现异常,我们经常要用到对数据的限制。而对于枚举类型,系统会自动限定它的取值,程序员不需要额外考虑对值的判断,因此大大简化代码,提高程序的可读性、可维护性。 在Java程序的开发中,枚举类型经常被用在菜单项、操作类型、状态码等等的定义中。比如一个操作系统的文件操作类型就可以定义为枚举类型,包括新建、打开、复制、粘贴、剪切等操作,这样就方便了后续的程序设计。 总之,枚举类型在Java程序设计中已经被广泛应用,在一些常量的定义、一些有限值数据类型的定义上使用枚举类型能够方便代码的编写,提高程序的可读性并减少程序出错的可能。 ### 回答3: 枚举Java中一种特殊的类,它可以用来定义一组固定的值,枚举成员就是这组固定的值。例如,我们可以定义一个枚举类来表示一周中的每一天: ``` public enum DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } ``` 在定义枚举类时,每个枚举成员都是一个对象,它们都是该枚举类的实例。枚举成员的值默认为它们在枚举类中的位置,可以通过枚举成员的ordinal()方法获取。 枚举类中可以定义成员变量、构造方法、普通方法和静态方法。枚举成员作为对象,可以调用枚举类中的成员方法。 枚举还可以用在switch语句中,例如: ``` DayOfWeek day = DayOfWeek.MONDAY; switch (day) { case MONDAY: System.out.println("Today is Monday."); break; case TUESDAY: System.out.println("Today is Tuesday."); break; case WEDNESDAY: System.out.println("Today is Wednesday."); break; case THURSDAY: System.out.println("Today is Thursday."); break; case FRIDAY: System.out.println("Today is Friday."); break; case SATURDAY: System.out.println("Today is Saturday."); break; case SUNDAY: System.out.println("Today is Sunday."); break; } ``` 以上代码输出的结果是“Today is Monday.”。 枚举的好处是使代码更容易理解和维护,因为它将具有相同含义的常量组织在一起,而且可以避免使用数字表示常量,增加代码的可读性。另外,枚举还可以提供类型安全检查,避免类型错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小扳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值