1、java枚举泛型第4章 枚举和泛型 -6.1 枚举 -6.2 泛型 1 知识点1.1 上次内容1. Java异常处理1.2 习题讲解1. 求int型数组元素的平均值。(提示:存在空对象异常和除数为0等潜在错误,要求使用异常进行处理。(参考教材128页)package cn.xit.java;public class avgDemo private static int a =new int ; private static int sum = 0; private static double avg; public static void main(String args) for (int
2、i : a) sum += i; try avg = sum / a.length; catch (Exception e) e.printStackTrace(); System.out.println(avg); 1.3 本次内容知识点1. 枚举2. 泛型了解1. 枚举扩展【重点】 1. 泛型2. 枚举难点1. 泛型2. 枚举2 具体内容6.1 枚举在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如:星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在java中如何更好的使用这些“数据集”呢
3、?因此枚举便派上了用场。6.1.1 枚举简介 在JDK 1.5之前,JAVA可以有两种方式定义新类型:类和接口。对于大部分面向对象编程来说,这两种方法看起来似乎足够了。 但是在一些特殊情况下,这些方法就不适合。例如,想定义一个Color类,它只能有 Red、Green、Blue三种值,其他的任何值都是非法的,那么JDK 1.5之前虽然可以构造这样的代码,但是要做很多的工作,也有可能带来各种不安全的问题。而JDK 1.5之后引入的枚举类型(Enum)就能避免这些问题。 枚举就是规定好了指定的取值范围,所有的内容只能从指定的范围中取得,也就是一个类只能产生固定的几个对象。范例:使用定义类实现枚举操
4、作。class Color public static final Color RED = new Color(红色); / 定义第一个对象 public static final Color GREEN = new Color(绿色); / 定义第二个对象 public static final Color BLUE = new Color(蓝色); / 定义第三个对象 private String name; private Color(String name) / 构造方法私有化,同时设置颜色的名称 this.setName(name); / 为颜色的名字赋值 public String
5、 getName() / 取得颜色名称 return this.name; public void setName(String name) / 设置颜色名称 this.name = name; public static Color getInstance(int i) / 得到一个颜色,只能从固定的几个颜色中取得 switch (i) case 1: / 返回红色对象 return RED; case 2: / 返回绿色对象 return GREEN; case 3: / 返回蓝色对象 return BLUE; default: return null; / 错误的值 范例:使用接口表示一
6、组范围package cn.xit.java;public interface Color public static final int RED = 1 ; / 表示红色 public static final int GREEN = 2 ; / 表示绿色 public static final int BLUE = 3 ; / 表示兰色public class ColorDemo02 public static void main(String args) System.out.println(Color.RED + Color.GREEN) ; / 颜色相加 6.1.2 定义一个枚举类型
7、 在JDK 1.5之后,引入了一个新的关键字类型 enum,可以直接定义枚举类型,格式如下:public enum 枚举类型名称枚举对象1,枚举对象2,枚举对象n ;范例:定义一个Color的枚举类型。package cn.xit.java;public enum Color / 定义枚举类型 RED, GREEN, BLUE; / 定义枚举的三个类型范例:枚举操作。public class GetEnumContent public static void main(String args) Color c = Color.BLUE ; / 取出蓝色 System.out.println(c
8、) ; / 输出信息/*使用foreach输出枚举内容*/ for(Color c:Color.values() / 枚举.values()表示得到全部枚举的内容 System.out.println(c) ; / 输出枚举内容 /*使用switch进行判断*/ public static void print(Color color) switch(color) / 判断每个颜色 case RED: / 直接判断枚举内容 System.out.println(红颜色) ; break ; case GREEN: / 直接判断枚举内容 System.out.println(绿颜色) ; bre
9、ak ; case BLUE: / 直接判断枚举内容 System.out.println(蓝颜色) ; break ; default: / 未知内容 System.out.println(未知颜色) ; break ; 6.1.3 Enum使用enum关键字可以定义一个枚举。实际上此关键字表示的是java.lang.Enum类型,即:使用enum声明的枚举类型,就相当于定义一个类,而此类默认继承java.lang.Enum类。java.lang.Enum类的定义如下: public abstract class EnumE extends Enumextends Objectimpleme
10、nts Comparable, java.io.Serializable枚举类的主要操作方法:No.方法类型描述1protected Enum(String name,int ordinal)构造接收枚举的名称和枚举的常量创建枚举对象2protected final Object clone()throws CloneNotSupportedException普通克隆枚举对象3public final int compareTo(E o)普通对象比较4public final boolean equals(Object other)普通比较两个枚举对象5public final int has
11、hCode()普通返回枚举常量的哈希码6public final String name()普通返回此枚举的名称7public final int ordinal()普通返回枚举常量的序数8public static T extends Enum T valueOf(Class enumType,String name)普通返回带指定名称的指定枚举类型的枚举常量protected Enum(String name, int ordinal)6.1.4 取得枚举的信息枚举类的构造方法:protected Enum(String name,int ordinal);在枚举类建立完成之后,实际上都会
12、为其调用枚举类中的构造方法,为其赋值,在Enum类的构造方法中的第一个参数name就是定义的枚举的名称,第二个参数ordinal则会从0开始依次进行编号。之后可以使用Enum类中提供的name()和ordinal()方法取得名字和编号。 范例:获取枚举的信息(编号和名称)package cn.xit.java;enum Color RED, GREEN, BLUE;public class HelloDemo public static void main(String args) for (Color c : Color.values() System.out.println(c.ordin
13、al() + - + c.name(); 6.1.5为枚举类的每一个对象赋值可以通过构造方法和setter方法两种方式为枚举中的每个属性赋值: 每个枚举类中都有其指定好的若干对象,当然,每一个枚举对象中也可以包含多个属性。而这些属性也可以通过构造方法为其赋值。 也可以通过调用setter()的方式为指定的属性赋值,但是必须明确每一个枚举类的对象。如果操作的对象是RED,则名字应该为“红色”,如果操作的对象是GREEN,则名字应该为“绿色”等。 范例:通过构造方法为属性赋值package cn.xit.java;enum Color RED(红色), GREEN(绿色), BLUE(兰色); /
14、 定义枚举的三个类型 private Color(String name) / 定义构造方法 this.setName(name) ; / 设置名字 private String name ; / 定义name属性 public String getName() / 取得name属性 return name; public void setName(String name) / 设置name属性 this.name = name; public class HelloDemo public static void main(String args) for(Color c:Color.valu
15、es() / 枚举.values()表示得到全部枚举的内容 System.out.println(c.ordinal() + - + c.name() + ( + c.getName() + ) ;/ 输出 范例:通过setter方法为属性赋值。package cn.xit.java;enum Color RED, GREEN, BLUE; / 定义枚举的三个类型 private String name ; / 定义name属性 public String getName() return name; public void setName(String name) switch(this)
16、case RED: / 判断是否是红色 if(红色.equals(name) this.name = name ; / 设置名称 else System.out.println(设置内容错误。) ; break ; case GREEN: / 判断是否是红色 if(绿色.equals(name) this.name = name ; / 设置名称 else System.out.println(设置内容错误。) ; break ; case BLUE: / 判断是否是红色 if(蓝色.equals(name) this.name = name ; / 设置名称 else System.out.
17、println(设置内容错误。) ; break ; public class HelloDemo public static void main(String args) Color c = Color.BLUE; c.setName(蓝色); System.out.println(c.ordinal() + - + c.name() + ( + c.getName() + ) ;/ 输出 6.1.6 valueof()如果不想通过“枚举类.对象”的形式取得每一个枚举类的对象,也可以使用Enum类定义的“枚举类.valueof()”方法的形式进行调用。 范例:通过valueof()方法取得枚
18、举对象。package cn.xit.java;enum Color RED, GREEN, BLUE; / 定义枚举的三个类型 private String name ; / 定义name属性 public String getName() return name; public void setName(String name) switch(this) case RED: / 判断是否是红色 if(红色.equals(name) this.name = name ; / 设置名称 else System.out.println(设置内容错误。) ; break ; case GREEN:
19、 / 判断是否是绿色 if(绿色.equals(name) this.name = name ; / 设置名称 else System.out.println(设置内容错误。) ; break ; case BLUE: / 判断是否是蓝色 if(蓝色.equals(name) this.name = name ; / 设置名称 else System.out.println(设置内容错误。) ; break ; public class HelloDemo public static void main(String args) /Color c = Color.BLUE; Color c =
20、 Enum.valueOf(Color.class, BLUE) ; /c.setName(兰色) ; / 设置一个错误的名字 c.setName(蓝色) ; / 设置一个正确的名字 System.out.println(c.ordinal()+-+c.name()+(+c.getName()+); 6.1.7 综合示例范例:枚举综合示例。package cn.xit.java;/* * 枚举用法详解*/public class HelloDemo /* * 1、普通枚举 */ public enum ColorEnum red, green, yellow, blue; /* * 2、枚举像
21、普通的类一样可以添加属性和方法,可为它添加静态和非静态的属性或方法 */ public enum SeasonEnum /注:枚举写在最前面,否则编译出错 spring, summer, autumn, winter; private final static String position = test; public static SeasonEnum getSeason() if (test.equals(position) return spring; else return winter; /* * 3、实现带有构造器的枚举 */ public enum Gender /通过括号赋值
22、,而且必须带有一个参构造器和一个属性跟方法,否则编译出错 /赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也出错 MAN(MAN), WOMEN(WOMEN); private final String value; /构造器默认也只能是private, 从而保证构造函数只能在内部使用 Gender(String value) this.value = value; public String getValue() return value; /* * 订单状态 * 4、实现带有抽象方法的枚举 */ public enum OrderState /*
23、已取消 */ CANCEL public String getName()return 已取消;, /* 待审核 */ WAITCONFIRM public String getName()return 待审核;, /* 等待付款 */ WAITPAYMENT public String getName()return 等待付款;, /* 正在配货 */ ADMEASUREPRODUCT public String getName()return 正在配货;, /* 等待发货 */ WAITDELIVER public String getName()return 等待发货;, /* 已发货
24、*/ DELIVERED public String getName()return 已发货;, /* 已收货 */ RECEIVED public String getName()return 已收货; public abstract String getName(); public static void main(String args) /枚举是一种类型,用于定义变量,以限制变量的赋值;赋值时通过“枚举名.值”取得枚举中的值 ColorEnum colorEnum = ColorEnum.blue; switch (colorEnum) case red: System.out.pri
25、ntln(color is red); break; case green: System.out.println(color is green); break; case yellow: System.out.println(color is yellow); break; case blue: System.out.println(color is blue); break; /遍历枚举 System.out.println(遍历ColorEnum枚举中的值); for(ColorEnum color : ColorEnum.values() System.out.println(colo
26、r); /获取枚举的个数 System.out.println(ColorEnum枚举中的值有+ColorEnum.values().length+个); /获取枚举的索引位置,默认从0开始 System.out.println(ColorEnum.red.ordinal();/0 System.out.println(ColorEnum.green.ordinal();/1 System.out.println(ColorEnum.yellow.ordinal();/2 System.out.println(ColorEnum.blue.ordinal();/3 /枚举默认实现了java.l
27、ang.Comparable接口 System.out.println(ColorEpareTo(ColorEnum.green);/-1 /- System.out.println(=); System.err.println(季节为 + SeasonEnum.getSeason(); /- System.out.println(=); for(Gender gender : Gender.values() System.out.println(gender.value); /- System.out.println(=); for(OrderState order : OrderState.values()
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2