枚举(枚举类)
一个类所能创建的对象个数是有限且固定的, 可以将每一个对象一一列举出来。
数据类型
基本数据类型: 8个, byte int short long float double char boolean
引用数据类型: 数组[] 类class 抽象类abstract class 接口interface 枚举enum 注解@interface
1. 手动设计出枚举效果
枚举是jdk1.5版本之后才出现的,jdk1.6版本时可以让枚举类在switch中进行比较。
那么没有枚举时,我们来试试如何通过手动设计,大致实现枚举的效果。
public class MyDay {//描述星期
//类似单例模式的思路
//构造方法私有
private MyDay(){}
//所有对象都是属性
public static final MyDay monday = new MyDay();
public static final MyDay tuesday = new MyDay();
public static final MyDay wednesday = new MyDay();
public static final MyDay thursday = new MyDay();
public static final MyDay firday = new MyDay();
public static final MyDay saturday = new MyDay();
public static final MyDay sunday = new MyDay();
//一般属性,一般方法随便设计
public String name;
}
2. 直接定义一个enum类型
JDK1.5版本之后可以直接定义enum类型。
public enum Day {
//描述了7个当前类的对象
monday,tuesday,wednesday,thursday,friday,saturday,sunday
}
我们自己定义的enum类型直接默认继承Enum(java.lang包),间接继承Object类。
我们自己定义的enum类型不能再写extends ,不能再继承别的类,因为java是不允许多继承的,但是可以实现别的接口。
枚举类中,
有两个属性
- name----->枚举对象的名字, 通过 name()可获取name属性
- ordinal—>枚举对象在类中罗列的顺序, 类似index, 也从0开始 ,通过 ordinal()可获取序号。
有一些常用的方法
- valueOf() 通过给定的name获取对应的枚举对象
Day dd = Day.valueOf("monday");
System.out.println(dd.name()+"==="+dd.ordinal());
这里可能会遇到的一个异常:
java.lang.IllegalArgumentException
Day dd = Day.valueOf("monda");//枚举类中没有名为monda的对象
- values() 【这个方法源码里找不到,是虚拟机加载的时候默认放在里面的】
获取全部的枚举对象 —> 返回一个数组 Day[]
Day[] days = Day.values();
for (Day d:days){
System.out.println(d.name()+"---"+d.ordinal());
}
- compareTo() 可以比较两个枚举对象 int
- toString() 由于这个方法没有final修饰 可以覆盖(重写)
3. switch内部判断枚举的应用
jdk1.5版本之前,switch()中只能是int(byte,short)类型,char类型。
jdk1.6版本,switch()中可以是枚举类型。
jdk1.7版本,switch()中可以是String类型。
package my_enum;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//输入一个字符串monday,输出对应的信息
Scanner input = new Scanner(System.in);
System.out.println("请输入一个星期的英文单词");
String key = input.nextLine();
//通过输入的英文单词找到对应的枚举对象
Day day = Day.valueOf(key);
switch (day){
case monday:
System.out.println("您输入的是星期一");
break;
case tuesday:
System.out.println("您输入的是星期二");
break;
case wednesday:
System.out.println("您输入的是星期三");
break;
case thursday:
System.out.println("您输入的是星期四");
break;
case friday:
System.out.println("您输入的是星期五");
break;
case saturday:
System.out.println("您输入的是星期六");
break;
case sunday:
System.out.println("您输入的是星期日");
break;
}
}
}
4.我们也可以在enum中描述自己的一些属性或方法
必须在enum类中第一行 描述一下枚举的样子 最后需要分号结束;
可以定义自己的属性
类创建的过程中 帮我们创建枚举类型的对象
需要给枚举类型提供对应样子的构造方法 , 而且构造方法只能private修饰 , 构造方法可以重载。
package my_enum;
public enum Day {
//描述了7个当前类的对象
monday("星期一",1),tuesday("星期二",2),wednesday,thursday,friday,saturday,sunday;
//有了自己描述的属性和方法后,上面描述的枚举对象必须加分号,表示描述结束。
private String name;
private int index;
private Day(){}
private Day(String name,int index){
this.name = name;
this.index = index;
}
public String getName(){
return name;
}
}
在我看来,其实枚举就相当于是一个类,这个类下的对象是有个数的,开发当中可以不用它,用了它可以让我们写代码变得方便,仅此而已。