A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© homeless 中级黑马   /  2014-3-5 22:27  /  1291 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

当一个类的实例个数有限,并且固定,这时就可以用枚举。它和在接口里定义的常量差不多。
比如
interface week{
     public static final int MON=1;
     public static final int TUE=2;
     ...........
}

enum Week{
   MON,TUE,...SUN;
}

区别在于,接口中的是常量,用整数来区别一周内的七天。而枚举用的是对象,并且提供相应的方法。

1.枚举它继承java.lang.enum类,而不是上帝object,并且该类实现了Serializable接口和comparable接口,所以肯定有compareTo(E)方法。
2.非抽象的枚举类默认使用final修饰,不能派生子类。如果枚举类内部有抽象方法,该类默认用abstract修饰,抽象方法用匿名子类对象实现(可不可以派生子类不清楚,如果你验证了,请告诉我)。
3.构造函数用并且只能用private修饰
4.因为枚举类的实例都是既定的,所以这些实例对象被规定只能显式全部的罗列在{}的第一行,这些实例被默认的public static final修饰。这些对象在罗列时,就相当于调用了对应的构造函数(这里的week就调用了7次),比如 第一个实例MON相当于public static final Week MON=new Week()。
如果定义了带参数的构造函数,罗列时也要相应的标明参数-------MON(“Monday”),TUE(“Tuesday”),...SUN(“Sunday”);--------
这里的MON(“Monday”)就相当于public static final Week MON=new Week(“Monday”);
使用他们时,用 类名.实例名 的方式获取他们。
5.附带的方法有 String name()返回实例的名字
                    String toString()和name()差不多;int ordinal()返回索引值,0开头;static values()返回该枚举的所有实例
                    static valueOf(Week.class,"SUN")返回字符串SUN对应的实例名
6.如果枚举类实现了接口,比如 interface MSG{void showInfo();}在枚举类里实现showInfo()时,他的每一个实例都会对应相同的方法体,因此
用匿名子类来具体化
enum Week implements MSG
{
   MON{
               public void showInfo(){System.out.println("今天是周一,要上班了");  }
           },
   TUE{
               public void showInfo(){System.out.println("周二了,还有四天才放假");   }
           },
   ...,
   SUN{
               public void showInfo(){   System.out.println("今天是周末,明天又要上班了");   }
           };
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

4 个回复

正序浏览
第四条:这些对象在罗列时,就相当于调用了对应的构造函数(这里的week就调用了7次)
应该要在加载这个枚举类时才会调用吧 假如定义了一个WeekDay枚举类 然后枚举类定义一个WeekDay weekday;变量,这时是不会调用构造函数的,要WeekDay weekday = WeekDay.MON;这样才会调用构造函数
回复 使用道具 举报
第一条就有问题了 java.lang.enum 类名不都是大写的吗?  enum 只是一个关键字 枚举类是继承java.lang.Enum类
而java.lang.Enum类又继承自java.lang.Object类 简单来说枚举类是间接地继承Object类
回复 使用道具 举报
枚举类 默认是final ? 这个我还没注意
回复 使用道具 举报
顶一个,总结的不错,特别是第二条和第三条;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马