赞
踩
一个类中的对象 认为个数是有限且固定的 可以将每一个对象一一列举出来
enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性。在Java中,被 enum 关键字修饰的类型就是枚举类型。
1.试一试若没有枚举类型的时候 如何手动设计 (静态常量 单例模式) Day(类 当做描述星期 7个对象)
private构造方法
public static final属性 = new
package myenum; public class MyDay {//描述星期 7个 //类似单例模式小的想法 //构造方法私有 private MyDay() {} //所有对象都是属性 public static final MyDay mondy = 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 static void main(String[] args) { Day[] days = Day.values();//获取所有的枚举对象 for(Day d: days) { System.out.println(d.name()+"---"+d.ordinal()); } Day d = Day.valueOf("monday"); //获取指定的枚举对象 System.out.println(d.name()+"---"+d.ordinal()); } }
我们自己定义的enum类型直接默认继承Enum(java.lang包)
我们自己定义的enum类型不能再写extends 但是可以实现
Enum类型
有两个属性
name----->枚举对象的名字 name()获取name属性
ordinal--->枚举对象在类中罗列的顺序 类似index 也从0开始 ordinal()获取序号
一些常用的方法
valueOf() 通过给定的name获取对应的枚举对象
values() 获取全部的枚举对象 ---> 返回一个数组 Day[]
compareTo() 可以比较两个枚举对象 int
toString() 由于这个方法没有final修饰 可以覆盖(重写)
所有枚举类都是Enum的子类,默认继承Enum,间接继承Object。
所有枚举类都默认是Enum类的子类,无需我们使用extends来继承。这说明Enum中的方法所有枚举类都拥有。
int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序,例如FRONT的下标为0,BEHIND下标为1,那么FRONT小于BEHIND;
boolean equals(Object o):比较两个枚举常量是否相等;
int hashCode():返回枚举常量的hashCode;
String name():返回枚举常量的名字;
int ordinal():返回枚举常量在枚举类中声明的序号,第一个枚举常量序号为0;
String toString():把枚举常量转换成字符串;
static T valueOf(Class enumType, String name):把字符串转换成枚举常量。
enum 不可以继承另外一个类,当然,也不能继承另一个 enum 。
因为 enum 实际上都继承自 java.lang.Enum 类,而 Java 不支持多重继承,所以 enum 不能再继承其他类,当然也不能继承另一个 enum。
(1)、在Day枚举类中列举7个对象。
package myenum;
public enum Day {
//相当于描述了七个当前类的对象
monday,tuesday,wednesday,thursday,friday,staturday,sunday;
//可以直接罗列出来
}
(2)、在main方法里面,枚举类型与switch联用,判断枚举类型。
package myenum; 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 days = Day.valueOf(key);//通过输入的英文单词找到对应的枚举对象 switch (days) {//1.5之前 int(byte short) char 1.6enum 1.7String 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 staturday: System.out.println("你输入输入的是星期六"); break; case sunday: System.out.println("你输入输入的是星期日"); break; default: System.out.println("出现错误"); } } }
注意,在switch中,不能使用枚举类名称,这是错误的,因为编译器会根据switch中days的类型来判定每个枚举类型,在case中必须直接给出与days相同类型的枚举选项,而不能再有类型。
必须在enum类中第一行 描述一下枚举的样子 最后需要分号结束; monday(name:"星期一",index:1); 可以定义自己的属性 private String name; private int index; 类创建的过程中 帮我们创建枚举类型的对象 需要给枚举类型提供对应样子的构造方法 构造方法只能private修饰 可以重载 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; }
枚举可以添加普通方法、静态方法、抽象方法、构造方法
Java 虽然不能直接为实例赋值,但是它有更优秀的解决方案:为 enum 添加方法来间接实现显示赋值。
创建 enum 时,可以为其添加多种方法,甚至可以为其添加构造方法。
注意一个细节:如果要为enum定义方法,那么必须在enum的最后一个实例尾部添加一个分号。此外,在enum中,必须先定义实例,不能将字段或方法定义在实例前面。否则,编译器会报错。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。