一个类中的对象 认为个数有限且固定的 可以将每一个对象一一列举出来
即在枚举类中直接列举对象
JDK1.5版本后可以直接定义enum类型
我们自己定义的enum类型 直接默认继承Enum类(java.lang包)
我们自己定义的enum类型不能再extends继承其他类 但是可以implements实现
Enum类型
有两个属性
name——>枚举对象的名字
name()来获取name属性
ordinal——>枚举对象在类中罗列的顺序 类似于index 从0 开始
ordinal()获取序号
一些常用的方法
valueOf() 通过给定的name获取对应的枚举对象
values() (源码中没有 是在虚拟机加载的时候 执行程序前手动放里面的)
获取全部的枚举对象——>返回一个数组 Day[]
compareTo() 可以比较两个枚举对象 返回值是int
如 monday.compareTo(tuesday)—->返回值是负的
monday.compareTo(monday)—->返回值是0的
tuesday.compareTo(monday)—->返回值是正的
ToString() 由于这个方法没有用final修饰 可以重写(覆盖)
还有一些从Object继承过来的方法 但是都加了final修饰 不可修改
我们也可以在enum中描述自己的属性或方法
必须在enum类中第一行 描述一下枚举的样子 最后需要分号结束
可以定义自己的属性
类创建的过程中 就已经帮我们创建了枚举类型的对象(私有的构造方法)
若想创建枚举样子的对象 所以我们需要给枚举类型提供对应样子的构造方法 且构造方法只能用private修饰
方法可以重载
没有枚举类型前 是这样设计的:
package test_enum;
public class MyDay {//描述星期 共七个
//类似单例模式的想法
//公有的静态常量作为属性
//公有保证对象能调得到,不用再写一个方法 静态保证对象唯一 final保证对象不能随意修改
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 friday = new MyDay();
public static final MyDay saturday = new MyDay();
public static final MyDay sunday = new MyDay();
//构造方法私有 别人就不能创建对象了
private MyDay(){}
//一般属性 一般方法都可以随意设计
}
有了枚举类型后:
package test_enum;
public enum Day{
//描述了七个当前类的对象
monday,tuesday,wednesday,thursday,friday,saturday,sunday
}
枚举类型中描述自己的属性或方法:
package test_enum;
public enum Day{
//描述了七个当前类的对象
monday("星期一",1),tuesday,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 this.name;
}
public void setName(String name){
this.name = name;
}
}
主方法:
package test_enum;
public class RunMain {
public static void main(String[] args){
MyDay myDay = MyDay.monday;//因为属性是对象 所以需要对象来接受
Day day = Day.monday;//enum定义的
//Day 默认继承的是Object类
//除了继承Object类的方法外 还有一些另外的方法 其默认继承的Enum类
//我们自己定义的每一个enum类型 都会默认继承Enum类 间接继承Object类(Enum类中重写了Object类的方法)
//所以不能再继承其他类
Day[] days = Day.values();//获取全部枚举对象
for(Day d:days){
System.out.println(d.name()+"---"+d.ordinal());
}
Day day1= Day.valueOf("monday");//调用静态方法valueOf 通过name叫monday的 找到一个对象
System.out.println(day1.name()+"---"+day.ordinal());
}
}
swiitch内部判断枚举的应用:
public static void main(String[] args){
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;
default:
System.out.println("输入错误");
}
}