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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Alex shaw 中级黑马   /  2013-3-16 16:13  /  1439 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码
如上代码,看张老师视频的时候,张老师首先举了一个例子,就是在一个普通的类里,私有化无惨构造函数,并且创建两个静态实例,用来模仿枚举,那应该说是枚举里面的每个参数应该是一个静态实例吧,但是为什么在枚举里面定义的抽象方法,在实例中需要重写呢

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
但是为什么在枚举里面定义的抽象方法,在实例中需要重写呢?
回答:1.你要知道,枚举中的每一个元素(实例),就是它本类的一个实例对象
2. 枚举类一但加载,它里面的所有元素就会进内存,如果你的类中还有抽象方法,你就不能实例化出来该类的实例了。
3.  你想看:你如果类中还有抽象方法,你怎么创建本类对象呢,所以你必须在它的所有实例中复盖所有的抽象方法,才可以创建其本类对象,

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
定义抽象,是为了不让你创建对象。
枚举就是把需要的对象全都罗列出来,只允许使用指定的几个对象,就像星期一到星期天,一个星期只有这7天,你不可能在创建一个星期八对象。
所以定义为抽象。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
itserious 发表于 2013-3-16 16:35
但是为什么在枚举里面定义的抽象方法,在实例中需要重写呢?
回答:1.你要知道,枚举中的每一个元素(实例) ...

我们一般是说,子类要实现一个抽象父类的抽象方法,也就是说这里其实是把这个实例当做是继承这个枚举的一个子类对吗
回复 使用道具 举报
不是继承。举个例子:A{a,b,c,d}为一个枚举,你可以枚举理解为一个特殊的类。这里的a,b,c,d就是A这个类,new  出来的对象,再把它们封装在这个类中作为静态成员,可以用"类名.a"这种方式来枚举中的成员。
注意:枚举的构造方法是私有的,所以枚举类一但定义完成,它里面的元素就是固定的,即只有{a,b,c,d}不能再创建新的元素了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马