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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗海云 中级黑马   /  2013-2-23 16:04  /  2079 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗海云 于 2013-2-23 21:06 编辑
  1. public enum TrafficLamp
  2. //RED,GRREN<FONT color=red>难道就相当于new了一个吗?></FONT>
  3. {
  4. RED(30){   public TrafficLamp nextLamp(){
  5. return GREEN;
  6. }
  7. },
  8. GREEN(45){   
  9. public TrafficLamp nextLamp(){
  10. return YELLOW;
  11. }
  12. },
  13. YELLOW(5){
  14. public TrafficLamp nextLamp(){
  15. return RED;
  16. }
  17. };
  18. public abstract TrafficLamp nextLamp();
  19. private int time;
  20. private TrafficLamp(int time){
  21. this.time = time;
  22. }
  23. }
复制代码
/*就是想问下这个RED,GREEN...是不是一定义就相当于new TrafficLamp对象.......
还有为什么枚举类里面可以创建抽象类呢?枚举类相当于是什么呢? 说下原理,谢谢.*/
都整蒙圈了

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览

回帖奖励 +1

....{:soso_e120:}....
回复 使用道具 举报
  1. package enumtest;
  2. public class EnumDemo {

  3.         /**
  4.          * 关于枚举。
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 System.out.println(enu.A.getClass());
  9.         }

  10. }

  11. enum enu {
  12.         A, B, C, D;
  13. }
  14. 输出:class enumtest.enu
复制代码
说明A是一个对象,它的字节码文件是class enumtest.enu,还有枚举enu定义在了class EnumDemo{}外,也就说明enu是一个类,enu会在像类一样加载,A,B,C,D是这个类的实例。
  1. package enumtest;

  2. public class EnumDemo {

  3.         /**
  4.          * 关于枚举。
  5.          *
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 System.out.println(enu.A.getClass());
  10.                 System.out.println(enu.A.getClass().getSuperclass());
  11.         }

  12. }

  13. enum enu {
  14.         A {
  15.                 void method() {
  16.                         System.out.println("A");
  17.                 }
  18.         },
  19.         B {
  20.                 void method() {
  21.                         System.out.println("A");
  22.                 }
  23.         },
  24.         C {
  25.                 void method() {
  26.                         System.out.println("A");
  27.                 }
  28.         },
  29.         D {
  30.                 void method() {
  31.                         System.out.println("A");
  32.                 }
  33.         };
  34.         abstract void method();
  35. }
  36. 输出:class enumtest.enu$1
  37.          class enumtest.enu
复制代码
既然enu是类,可以定义它为抽象类,那么它的实例就必须要实现它的抽象方法,但是抽象方法不能被实例化,那么A,B,C,D用匿名内部类来了个实例化。所以输出它的字节码类为class enumtest.enu$1,字节码的父类为 class enumtest.enu。总之,就把枚举 enu的成员看成它的实例就ok了,当enu是抽象时,成员看成enu子类的实例,只不过这个子类在其内部!偶了!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 吴硕 于 2013-2-23 18:53 编辑

其中的RED、GREEN可以理解为new TrafficLamp,其实是在创建TrafficLamp的实例,而在例子中,使用了带参的构造函数,并实现了抽象方法

枚举类是一种特殊的类。
首先枚举类是一种类,其他类可以有的,枚举类也可以有

但枚举类又是特殊的,特殊之处在于:
使用enum定义的枚举默认继承了java.lang.Enum类,Enum类实现了Comparabel, Serializable接口
枚举类的构造器只能使用private修饰
枚举类的所有实例都必须在枚举类中显示列出,否则这个枚举类将不能产生实例,并会自动添加public static final修饰符修饰这些实例

枚举类就是这样的一个特殊类

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
谢谢楼上两位生动的解答, 我在仔细去研究去了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马