黑马程序员技术交流社区

标题: 枚举类的疑惑 [打印本页]

作者: 歌诗王道    时间: 2014-4-17 12:18
标题: 枚举类的疑惑
本帖最后由 歌诗王道 于 2014-4-21 18:35 编辑
  1. public enum TrafficLamp
  2. {
  3.     RED(30)
  4.     {
  5.         public TrafficLamp nextLamp()
  6.         {
  7.              return Green;
  8.          }
  9.      },
  10.     GREEN(45)
  11.     {
  12.          public TrafficLamp nextLamp()
  13.          {
  14.              return YELLOW;
  15.           }
  16.      },
  17.      Yellow(5)
  18.     {
  19.          public TrafficLamp nextLamp()
  20.          {
  21.              return RED;
  22.           }
  23.      };
  24.      public abstract TrafficLamp nextLamp();
  25.      private int time;
  26.      private TrafficLamp(int time){this.time = time;}
  27. }
复制代码
枚举类里定义的元素RED,GREEN,YELLOW的格式没有看懂,是不是匿名内部子类的一种简写方式?

作者: 呆呆沙师妹    时间: 2014-4-17 13:42
枚举可看作一种特殊的类,可添加一些方法。枚举中的元素作为一种特殊类的实例,必须放在枚举内的最前面,它们都是对象,不需要加入集合中,枚举只用实例化一次,就能使用其他所有的枚举元素和方法;枚举中元素是固定的,因而枚举中的构造函数必须私有化。
作者: igi9009    时间: 2014-4-17 14:18
你可以把RED,GREEN和YELLOW看作是TrafficLamp的子类new出来的3个对象,既然是对象,就会有自己的内容,而对象后面的{}里面就写内容。这三个对象都有自己个构造方法和自己的函数。TrafficLamp定义了nextLamp()函数,而RED,GREEN和YELLOW这三个对象就各自复写了这个函数。TrafficLamp里定义了自己的构造方法,RED、GREEN和YELLOW也继承了TrafficLamp的构造方法
作者: Teemo_Mann    时间: 2014-4-17 17:34
首先要明白枚举里面的每一个成员都是一个对象,我们先用普通类来实现看看
  1. abstract class Color{
  2.         private int sth;
  3.         private Color(){}
  4.         private Color(int sth){this.sth = sth};
  5.         public final static ColorRED= new Color(){   //这边就是用到了匿名类,并且是无参构造函数

  6.                 @Override
  7.                 public Color nextColor() {
  8.                         // TODO Auto-generated method stub
  9.                         return BLUE;
  10.                 }
  11.                
  12.                
  13.         };
  14.         public final static ColorBLUE= new Color(5){  //这边我们使用匿名类,并用有参构造器

  15.                 @Override
  16.                 public Color nextColor() {
  17.                         // TODO Auto-generated method stub
  18.                         return RED;
  19.                 }
  20.                
  21.         };

  22.         public abstract Color nextColor();
复制代码

new Runnable(){
public void run(){}};像这样的写法就是新建一个实现了Runnable接口的子类对象.如果这个Runnable有有参构造器,还是可以在括号里传值的.
这个看懂了之后再去看你上面的代码,其实就是一件事了,只不过枚举里的成员帮我们封装一下,先理解下上面的例子再看看你的代码,自己理解一下,不懂再看视频




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2