码迷,mamicode.com
首页 > 其他好文 > 详细

枚举类型

时间:2020-12-22 12:16:34      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:front   rgba   pareto   变量   hash   传递   匿名类   静态   错误   

1:什么是枚举:

对比单例模式,枚举就是一种意义上的多例。有的时候,一个类的对象有限并且固定,就可以考虑使用枚举。枚举类在第一行就已经定义了他所有的实例。
 
2:定义枚举类:
关键字 enum,
注意:
1.java中的所有关键字都是小写的吧。
2.不能通过new来创建枚举对象。因为枚举对象昂的实例就是类中的枚举项,只能够在类的外边通过类名.枚举项来调用。
public enum Direction {
    SPRING, SUMMER, FALL, WINTER;
}
Seanson s = Season.SPRING;
 
3:枚举与switch
枚举类型可以在switch中使用:
Season s = Season.SPRING;
  switch(d) {
    case SPRING: System.out.println("春天");break;
    case SUMMER:System.out.println("夏天");break;
    case FALL:  System.out.println("秋天");break;
    case WINTER: System.out.println("冬天");break;
    default:System.out.println("谁知道是什么季节呢?");
}
Direction s1 = s;
System.out.println(s1);
注意,在switch中,不能使用枚举类名称,例如:“case Season.SPING:”这是错误的,因为编译器会根据switch中d的类型来判定每个枚举类型,在case中必须直接给出与d相同类型的枚举选项,而不能再有类型。
4:

所有枚举类都是Enum的子类
所有枚举类都默认是Enum类的子类,无需我们使用extends来继承。这说明Enum中的方法所有枚举类都拥有。

  • int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序,例如SPRING的下标为0,SUMMER下标为1,那么SPRING小于SUMMER;
  • boolean equals(Object o):比较两个枚举常量是否相等;
  • int hashCode():返回枚举常量的hashCode;
  • String name():返回枚举常量的名字;
  • int ordinal():返回枚举常量在枚举类中声明的序号,第一个枚举常量序号为0;
  • String toString():把枚举常量转换成字符串;
  • static T valueOf(Class enumType, String name):把字符串转换成枚举常量。

5:枚举构造器:

枚举类的构造器只能是private修饰,因为枚举类的实例不能由外界来创建。

但是要注意的是不需要手动添加,默认就是private

同时注意枚举类都是唯一构造器;有了无参的构造器,就不能定义有参的构造器,反过来同理。

public enum Season {
    SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");

    private final String name;

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

    public String getName() {
        return name;
    }
}

6:枚举可以有成员

其实枚举类和正常的类一样,可以有实例变量,实例方法,静态方法等等,只不过它的实例个数是有限的,不能再创建实例而已。

public enum Season {
    SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");

    private final String name;

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

    public String getName() {
        return name;
    }
  Serason s = Season.SPRING;
  System.out.println(s.getName());
}
因为Serson类只有唯一的构造器,并且是有参的构造器,所以在创建枚举项时,必须为构造器赋值:SPRING(“front”),其中”front”就是传递给构造器的参数。你不要鄙视这种语法,你应该做的是接受这种语法!
Season类中还有一个实例域:String name,我们在构造器中为其赋值,而且本类还提供了getName()这个实例方法,它会返回name的值。
 
7:枚举类中可以有抽象方法:
在枚举类中定义抽象方法的时候,然后在创建每一个枚举项的时候,都要通过匿名内部类的方式来重写抽象方法,每一个枚举项都是一个匿名类的子类对象。(注意这个应该是要必须重写的,毕竟每一个枚举项都是相当于创建了枚举类的对象,创建对象的时候,就要去实现他其中的抽象方法)。
通常fun()方法应该定义为抽象方法,因为每个枚举常量都会去重写它,你无法把Season生命为抽象类,但是需要声明fun()方法为抽象方法。
注意一定要加@Override
public enum Season {
    SPRING("春天"){
        @Override
        public void fun(){
            
        }
    },
    SUMMER("夏天"){
        @Override
        public void fun(){

        }
    },
    FALL("秋天"){
        @Override
        public void fun(){

        }
    },
    WINTER("冬天"){
        @Override
        public void fun(){

        }
    };

    private final String season;

    Season(String season) {
        this.season = season;
    }

    public String getSeason() {
        return season;
    }

    public abstract void fun();

}

8:每个枚举类都有两个特殊的方法:

每个枚举类都有两个不用声明就可以调用的static方法,而且这两个方法不是父类中的方法。这又是枚举类特殊的地方,下面是Direction类的特殊方法。

  • static Direction[] values():返回本类所有枚举常量;
  • static Direction valueOf(String name):通过枚举常量的名字返回Direction常量,注意,这个方法与Enum类中的valueOf()方法的参数个数不同。
参考自:https://www.jianshu.com/p/7d3e3f6695a5  (写的非常好)

枚举类型

标签:front   rgba   pareto   变量   hash   传递   匿名类   静态   错误   

原文地址:https://www.cnblogs.com/bad-squirrel/p/14148919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!