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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ㄗ灬Night|K 中级黑马   /  2013-10-9 18:09  /  1735 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ㄗ灬Night|K 于 2013-10-9 20:58 编辑

程序第8行,对象怎么直接调用了变量time ??? 不是很明白,在之前的学习中没出现这种情形吧。。。。
  1. package com.jemsn.weekday;  
  2.   
  3. public class test {  
  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.   
  11.      public enum TrafficLamp{  
  12.          Red(30){   
  13.             public TrafficLamp NextLamp() {               
  14.                 return GREEN;   
  15.             }              
  16.          },  
  17.          GREEN(45){   
  18.             public TrafficLamp NextLamp() {  
  19.             return YELLOW;  
  20.             }              
  21.          },  
  22.          YELLOW(5){   
  23.             public TrafficLamp NextLamp() {  
  24.                 return Red;  
  25.             }              
  26.          };  
  27.          //抽象方法  
  28.          public abstract TrafficLamp NextLamp();  
  29.          private int Time;  
  30.             
  31.          //枚举的有参构造函数  
  32.          private TrafficLamp(int time) {  
  33.             this.Time=time;           
  34.         }  
  35.      }  
  36. }  
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 加油哦,

查看全部评分

5 个回复

倒序浏览
本帖最后由 斗胆潇洒 于 2013-10-9 18:37 编辑

枚举类,不过是受了点约束的java类而已。很多东西还是java类的规则。
(1)首先,先看看张老师怎么用普通类模拟枚举类功能的,就大概能知道要实现枚举功能普通的java类要做什么约束。
(2)再结合下单例模式,去看枚举类的实现,只能创建本类对象而已,加final修饰。
(3)如果你反编译一个enum枚举类,会发现它是一个被final修饰的java类而已(这也就限制了枚举类不能派生了)。
结合上述三点,都没说类中不能有成员变量,且没说本类对象不能调用成员变量哈,没约束的规则你用就是的{:soso_e144:}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
枚举中每个元素都相当于枚举类的一个子类对象,你可以理解为元素都继承了枚举,所以枚举中定义的属性方法,枚举元素都可以直接拿来用,所以方法、属性都可以直接调用

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
private是私有的声明,对于在自身类之外的类中的方法进行调用时才会出错。由于你把枚举类定义为内部类,其本身就属于test该类的一个成员,在test类中调用其内部类的私有方法是不会报错的。想要报错,就把它定义为外部类吧,像这样
  1. public class  Test {  
  2.   
  3.     public static void main(String[] args) {  
  4.         TrafficLamp red=TrafficLamp.Red;  
  5.         System.out.println(red.NextLamp());  
  6.         System.out.println("this time is "+red.Time);  //这里就会提示TrafficLamp.time不可视
  7.     }  
  8. }  
  9. enum TrafficLamp{  
  10.          Red(30){   
  11.             public TrafficLamp NextLamp() {               
  12.                 return GREEN;   
  13.             }              
  14.          },  
  15.          GREEN(45){   
  16.             public TrafficLamp NextLamp() {  
  17.             return YELLOW;  
  18.             }              
  19.          },  
  20.          YELLOW(5){   
  21.             public TrafficLamp NextLamp() {  
  22.                 return Red;  
  23.             }              
  24.          };  
  25.          //抽象方法  
  26.          public abstract TrafficLamp NextLamp();  
  27.          private int Time;  
  28.             
  29.          //枚举的有参构造函数  
  30.          private TrafficLamp(int time) {  
  31.             this.Time=time;           
  32.         }  
  33. }  
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
人家问的是怎么调用的 time这个属性 。。
private TrafficLamp(int time) {  
            this.Time=time;           
}  
Red(30) 看到没  这个30就相当于构造函数里面那个time,RED是不是一个枚举对象,
它里面是不是有30这个time的属性,访问对象的属性是不是对象名.属性。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-10 10:49:01
地板
楼主你好,如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马