疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java基础枚举类详解


 

   

  枚举类不出来的时候只能如下写代码

  复制代码

  1 //Student.java

  2 package cn.itcast.enumeration;

  3

  4 public class Student {

  5 private String name;

  6 private String grade;//A B C D E

  7 public String getName() {

  8 return name;

  9 }

  10 public void setName(String name) {

  11 this.name = name;

  12 }

  13 public String getGrade() {

  14 return grade;

  15 }

  16 public void setGrade(String grade) {

  17 if(!grade.matches("[ABCDE]")){

  18 throw new RuntimeException("成绩输入错误");

  19 }

  20 this.grade = grade;

  21 }

  22 }

  复制代码

  第17行代码使用了正则表达式。

  复制代码

  1 //Test.java

  2 package cn.itcast.enumeration;

  3

  4 public class Test {

  5

  6 public static void main(String[] args) {

  7 // TODO Auto-generated method stub

  8 Student s = new Student();

  9 s.setGrade("H");

  10 }

  11 }

  复制代码

  这个代码有一点不好,就是给赋值了,但是程序运行是才报错。如何让写代码的时候就报错?看如下代码。

  复制代码

  1 //Student.java

  2 package cn.itcast.enumeration2;

  3

  4 public class Student {

  5 private String name;

  6 private Grade grade;//A B C D E

  7 public String getName() {

  8 return name;

  9 }

  10 public void setName(String name) {

  11 this.name = name;

  12 }

  13 public Grade getGrade() {

  14 return grade;

  15 }

  16 public void setGrade(Grade grade) {

  17 this.grade = grade;

  18 }

  19 }

  20

  21 class Grade{

  22 private Grade(){}

  23

  24 public static Grade A = new Grade();

  25 public static Grade B = new Grade();

  26 public static Grade C = new Grade();

  27 public static Grade D = new Grade();

  28 public static Grade E = new Grade();

  29 }

  复制代码

  定义一个自己使用的类,再赋值的时候只能赋指定的值,其他值都报错。

  复制代码

  1 //Test.java

  2 package cn.itcast.enumeration2;

  3

  4 public class Test {

  5

  6 public static void main(String[] args) {

  7 // TODO Auto-generated method stub

  8 Student s = new Student();

  9 s.setGrade(Grade.A);

  10 }

  11 }

  复制代码

  这种方法太复杂,下面使用枚举,只要三行就能取代21-29行的代码

  复制代码

  1 //Student.java

  2 package cn.itcast.enumeration3;

  3

  4 public class Student {

  5 private String name;

  6 private Grade grade;//A B C D E

  7 public String getName() {

  8 return name;

  9 }

  10 public void setName(String name) {

  11 this.name = name;

  12 }

  13 public Grade getGrade() {

  14 return grade;

  15 }

  16 public void setGrade(Grade grade) {

  17 this.grade = grade;

  18 }

  19 }

  20 /*

  21 class Grade{

  22 private Grade(){}

  23

  24 public static Grade A = new Grade();

  25 public static Grade B = new Grade();

  26 public static Grade C = new Grade();

  27 public static Grade D = new Grade();

  28 public static Grade E = new Grade();

  29 }

  30 */

  31 enum Grade{//也是定义了一个类

  32 A,B,C,D,E;//对应的是Grade类的对象

  33 }

  复制代码

  使用枚举类取代21-29行的代码。

  复制代码

  1 package cn.itcast.enumeration3;

  2

  3 public class Test {

  4

  5 public static void main(String[] args) {

  6 // TODO Auto-generated method stub

  7 Student s = new Student();

  8 s.setGrade(Grade.A);

  9 }

  10 }

  复制代码

  这种方法比较好,但是如何在枚举类里面封装更多的信息?看下面的代码

  复制代码

  1 //Student.java

  2 package cn.itcast.enumeration4;

  3

  4 public class Student {

  5 private String name;

  6 private Grade grade;//A B C D E

  7 public String getName() {

  8 return name;

  9 }

  10 public void setName(String name) {

  11 this.name = name;

  12 }

  13 public Grade getGrade() {

  14 return grade;

  15 }

  16 public void setGrade(Grade grade) {

  17 this.grade = grade;

  18 }

  19 }

  20 /*

  21 class Grade{

  22 private Grade(){}

  23

  24 public static Grade A = new Grade();

  25 public static Grade B = new Grade();

  26 public static Grade C = new Grade();

  27 public static Grade D = new Grade();

  28 public static Grade E = new Grade();

  29 }

  30 */

  31 //如何让枚举封装更多的信息(如何让枚举对象拥有自己的属性)

  32 enum Grade{//也是定义了一个类

  33 A("100-90"),B("89-80"),C("79-70"),D("69-60"),E("59-0");//对应的是Grade类的对象

  34

  35 private String value;

  36 private Grade(String value){

  37 this.value = value;

  38 }

  39 public String getValue(){

  40 return value;

  41 }

  42 }

  复制代码

  封装成绩的同时,可以封装分数段,增加属性。

  复制代码

  1 //Test.java

  2 package cn.itcast.enumeration4;

  3

  4 public class Test {

  5 public static void main(String[] args) {

  6 // TODO Auto-generated method stub

  7 Student s = new Student();

  8 s.setGrade(Grade.A);

  9 System.out.println(Grade.A.getValue());

  10 }

  11 }

  复制代码

  那么如何在枚举类里面封装各自的方法呢?看下面的代码。

  复制代码

  1 //Student.java

  2 package cn.itcast.enumeration6;

  3

  4 public class Student {

  5 private String name;

  6 private Grade grade;//A B C D E

  7 public String getName() {

  8 return name;

  9 }

  10 public void setName(String name) {

  11 this.name = name;

  12 }

  13 public Grade getGrade() {

  14 return grade;

  15 }

  16 public void setGrade(Grade grade) {

  17 this.grade = grade;

  18 }

  19 }

  20 /*

  21 class Grade{

  22 private Grade(){}

  23

  24 public static Grade A = new Grade();

  25 public static Grade B = new Grade();

  26 public static Grade C = new Grade();

  27 public static Grade D = new Grade();

  28 public static Grade E = new Grade();

  29 }

  30 */

  31 //如何让枚举对象拥有自己的属性和各自的方法

  32 enum Grade{//也是定义了一个类

  33 A("100-90"){

  34 public String toLocalString(){

  35 return "优";

  36 }

  37 },B("89-80"){

  38 public String toLocalString(){

  39 return "良";

  40 }

  41 },C("79-70"){

  42 public String toLocalString(){

  43 return "中";

  44 }

  45 },D("69-60"){

  46 public String toLocalString(){

  47 return "一般";

  48 }

  49 },E("59-0"){

  50 public String toLocalString(){

  51 return "差";

  52 }

  53 };//对应的是Grade类的对象

  54

  55 private String value;

  56 private Grade(String value){

  57 this.value = value;

  58 }

  59 public String getValue(){

  60 return value;

  61 }

  62 public abstract String toLocalString();

  63 }

  复制代码

  返回成绩的中文表示。

  复制代码

  1 package cn.itcast.enumeration6;

  2

  3 public class Test {

  4

  5 public static void main(String[] args) {

  6 // TODO Auto-generated method stub

  7 Student s = new Student();

  8 s.setGrade(Grade.A);

  9 System.out.println(Grade.A.getValue());

  10 System.out.println(Grade.A.toLocalString());

  11 }

  12 }

  复制代码

  注意:枚举类的对象的方法必须是私有的,不能公有。

  枚举类有如下特性:

  1.枚举类也是一种特殊的Java类。

  2.枚举类中声明的每一个枚举值代表枚举类的一个实例对象。

  3.与Java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但是枚举类的构造函数必须为室友的(这点不难理解)。

  4.枚举类也可以实现接口、或基层抽象类。

  5.JDK5中扩展了switch语句,它除了可以接收int、byte、char、short外,还可以接收一个枚举类型。

  6.若枚举类只有一个枚举值,则可以当做单态设计模式。

  下面这样写也是单态设计模式。

  1 enum Demo{

  2 demo;

  3 }

  枚举类的常用方法

  复制代码

  1 public void test(){

  2 //枚举类的常用方法name,valueOf,values

  3 String name = "B";

  4 Grade g = Grade.valueOf(name);//把字符串转成枚举对象

  5 System.out.println(g.name());//获取枚举对象名称

  6

  7 Grade gs[] = Grade.values();

  8 for(Grade g1:gs){

  9 System.out.println(g1.name());

  10 }

  11 }

  复制代码

  心再坚强也不要独自飞翔