黑马程序员技术交流社区

标题: 关于枚举的一个疑惑 [打印本页]

作者: Alex shaw    时间: 2013-3-16 16:13
标题: 关于枚举的一个疑惑
  1. public enum TrafficLamp {
  2. //如果一个枚举定义一个实例,那就是个单例
  3.         RED(30){

  4.                 @Override
  5.                 public TrafficLamp nextLamp() {
  6.                         return GREEN;
  7.                 }
  8.                
  9.         },GREEN(0){

  10.                 @Override
  11.                 public TrafficLamp nextLamp() {
  12.                         return YELLOW;
  13.                 }
  14.                
  15.         },YELLOW(33){

  16.                 @Override
  17.                 public TrafficLamp nextLamp() {
  18.                         return RED;
  19.                 }
  20.                
  21.         };
  22.         //这个方法的返回值还是这个类的一个实例
  23.         public abstract TrafficLamp  nextLamp();
  24.         private int time;
  25.         private TrafficLamp(int time)
  26.         {
  27.                 this.time = time;
  28.         }
  29. }
复制代码
如上代码,看张老师视频的时候,张老师首先举了一个例子,就是在一个普通的类里,私有化无惨构造函数,并且创建两个静态实例,用来模仿枚举,那应该说是枚举里面的每个参数应该是一个静态实例吧,但是为什么在枚举里面定义的抽象方法,在实例中需要重写呢
作者: itserious    时间: 2013-3-16 16:35
但是为什么在枚举里面定义的抽象方法,在实例中需要重写呢?
回答:1.你要知道,枚举中的每一个元素(实例),就是它本类的一个实例对象
2. 枚举类一但加载,它里面的所有元素就会进内存,如果你的类中还有抽象方法,你就不能实例化出来该类的实例了。
3.  你想看:你如果类中还有抽象方法,你怎么创建本类对象呢,所以你必须在它的所有实例中复盖所有的抽象方法,才可以创建其本类对象,
作者: HM王琦    时间: 2013-3-16 20:18
定义抽象,是为了不让你创建对象。
枚举就是把需要的对象全都罗列出来,只允许使用指定的几个对象,就像星期一到星期天,一个星期只有这7天,你不可能在创建一个星期八对象。
所以定义为抽象。
作者: Alex shaw    时间: 2013-3-16 23:07
itserious 发表于 2013-3-16 16:35
但是为什么在枚举里面定义的抽象方法,在实例中需要重写呢?
回答:1.你要知道,枚举中的每一个元素(实例) ...

我们一般是说,子类要实现一个抽象父类的抽象方法,也就是说这里其实是把这个实例当做是继承这个枚举的一个子类对吗
作者: itserious    时间: 2013-3-16 23:18
不是继承。举个例子:A{a,b,c,d}为一个枚举,你可以枚举理解为一个特殊的类。这里的a,b,c,d就是A这个类,new  出来的对象,再把它们封装在这个类中作为静态成员,可以用"类名.a"这种方式来枚举中的成员。
注意:枚举的构造方法是私有的,所以枚举类一但定义完成,它里面的元素就是固定的,即只有{a,b,c,d}不能再创建新的元素了。




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