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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiangyutc 中级黑马   /  2014-2-5 17:28  /  2143 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class EnumDemo {

  2.         public static void main(String[] args) {
  3.                 TrafficLamp red=TrafficLamp.Red;
  4.                 System.out.println(red.NextLamp());
  5.                 System.out.println("this time is "+red.Time);
  6.         }

  7.          public enum TrafficLamp{
  8.                  Red(30){
  9.                         public TrafficLamp NextLamp() {                                 
  10.                                 return GREEN;
  11.                         }                         
  12.                  },
  13.                  GREEN(45){
  14.                         public TrafficLamp NextLamp() {
  15.                         return YELLOW;
  16.                         }                         
  17.                  },
  18.                  YELLOW(5){
  19.                         public TrafficLamp NextLamp() {
  20.                                 return Red;
  21.                         }                         
  22.                  };
  23.                  //抽象方法
  24.                  public abstract TrafficLamp NextLamp();
  25.                  private int Time;
  26.                   
  27.                  //枚举的有参构造函数
  28.                  private TrafficLamp(int time) {
  29.                         this.Time=time;                       
  30.                 }
  31.          }
  32. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄晓东 + 1

查看全部评分

10 个回复

倒序浏览
是为了让每个子类单独实现该抽象方法
回复 使用道具 举报
↑↓ME→← 发表于 2014-2-5 17:54
是为了让每个子类单独实现该抽象方法

枚举类不写抽象方法
子类元素里单独都写个方法不行吗
回复 使用道具 举报
jiangyutc 发表于 2014-2-5 18:05
枚举类不写抽象方法
子类元素里单独都写个方法不行吗

枚举里面。每个元素都是一个对象,对象可能有抽下个方法吗?
回复 使用道具 举报
黑马19我最牛 发表于 2014-2-5 19:56
枚举里面。每个元素都是一个对象,对象可能有抽下个方法吗?

我的意思是这个程序里面为什么一定要有抽象方法?
没有就不行吗?比如直接到元素里面创建这个一个方法
回复 使用道具 举报
楼主的意思就是为什么非要定义一个抽象方法,然后再在枚举类中的每个实例对象中再去实现它对吧。
首先,没有也行,但是代码就不能这样写了,你必须单独定义方法来操作红绿灯变换的这些数据,代码如下:
  1. public class EnumDemo {

  2.         /**
  3.          * @param args
  4.          */
  5.          public static void main(String[] args) {
  6.          TrafficLamp red=TrafficLamp.Red;
  7.          System.out.println(red.NextLamp());
  8.          System.out.println("this time is "+red.Time);
  9. }
  10.          public enum TrafficLamp{
  11.          Red(30){
  12. //                public TrafficLamp NextLamp() {                                 
  13. //                return GREEN;
  14. //                }
  15.          },
  16.          GREEN(45){
  17. //                public TrafficLamp NextLamp() {
  18. //                return YELLOW;
  19. //                }                        
  20.          },
  21.          YELLOW(5){
  22. //                public TrafficLamp NextLamp() {
  23. //                return Red;
  24. //                }                        
  25.          };
  26.          //抽象方法
  27.          //public abstract TrafficLamp NextLamp();
  28.          //单独定义方法操作这些数据
  29.          public TrafficLamp NextLamp() {                                 
  30.              if (this==Red) {
  31.                                 return GREEN;
  32.                          }else if(this==GREEN){
  33.                                  return YELLOW;
  34.                          } else{
  35.                                  return Red;
  36.                          }
  37.          }
  38.          private int Time;
  39.          
  40.          //枚举的有参构造函数
  41.          private TrafficLamp(int time) {
  42.                 this.Time=time;                        
  43.         }
  44. }     
  45. }
复制代码


然后就该说为什么要用抽象方法,像你的源程序中那样,定义一个抽象方法nextLamp(),然后让枚举类中的每个实例对象通过内部类实现它,这样会方便了很多,一是方便了调用nextLamp()方法,二是在枚举类中定义抽象方法以强制使每个实例对象都要实现这个方法,让程序符合实际情况。

评分

参与人数 1技术分 +1 收起 理由
黄晓东 + 1

查看全部评分

回复 使用道具 举报
陪你等日出 发表于 2014-2-7 01:20
楼主的意思就是为什么非要定义一个抽象方法,然后再在枚举类中的每个实例对象中再去实现它对吧。
首先,没 ...

多谢你懂我的意思,呵呵
但是我还是不明白,转换灯颜色的方法不是在元素里面有吗,
为什么非要在枚举类里面写呢?
red.NextLamp(); 这不就是调用元素里面的方法吗?
就是不要下面这段代码,和抽象方法为什么不行?可能是我基础学的不好,教教我呗
public TrafficLamp NextLamp() {                                 
             if (this==Red) {
                                return GREEN;
                         }else if(this==GREEN){
                                 return YELLOW;
                         } else{
                                 return Red;
                         }
回复 使用道具 举报
不要这些方法咋调用?貌似会报方法没有定义的错误吧,这个方法是TrafficLamp类的内部类里面的方法,你用red.NextLamp()怎么能调用到啊.
回复 使用道具 举报
  1. public class EnumDemo {

  2.         public static void main(String[] args) {
  3.                 TrafficLamp red=TrafficLamp.Red;
  4.                 System.out.println(red.NextLamp());
  5.                 System.out.println("this time is "+red.Time);
  6.         }

  7.          public enum TrafficLamp{
  8.                  Red(30){
  9.                         public TrafficLamp NextLamp() {                                 
  10.                                 return GREEN;
  11.                         }                        
  12.                  },
  13.                  GREEN(45){
  14.                         public TrafficLamp NextLamp() {
  15.                         return YELLOW;
  16.                         }                        
  17.                  },
  18.                  YELLOW(5){
  19.                         public TrafficLamp NextLamp() {
  20.                                 return Red;
  21.                         }                        
  22.                  };
  23.                  //抽象方法
  24.                  public abstract TrafficLamp NextLamp();
  25.                  private int Time;
  26.                   
  27.                  //枚举的有参构造函数
  28.                  private TrafficLamp(int time) {
  29.                         this.Time=time;                        
  30.                 }
  31.          }
  32. }
复制代码


枚举中加入,抽象方法,是让子类,必须写下该方法的实现。

作为抽象方法就是,以为着,该方法是,所有子类的抽象。所有子类向上抽取后,共有的该方法,增加了程序的扩展性,和严谨性~!!!!

希望对你有用》》》》》》怒进29期。

评分

参与人数 1技术分 +1 收起 理由
黄晓东 + 1

查看全部评分

回复 使用道具 举报
陪你等日出 发表于 2014-2-8 20:35
不要这些方法咋调用?貌似会报方法没有定义的错误吧,这个方法是TrafficLamp类的内部类里面的方法,你用red. ...

red.NextLamp()
的意思不就是调用red元素里面的NextLamp()方法吗???
不是说元素可以看作是子类吗,NextLamp()是在元素里面定义的方法啊,为什么不能这么调用?
我知道编译不通过,但是我想知道为什么不能通过
回复 使用道具 举报
e.c 中级黑马 2014-2-9 18:38:05
11#
枚举类中每个元素表示是这个枚举类的一个实例对象.
枚举类没有定义NextLamp()这个方法的话,它的对象又怎么会有这个方法呢?所以肯定编译不会通过.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马