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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔岩 中级黑马   /  2012-3-18 13:52  /  2590 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔岩 于 2012-3-18 14:10 编辑

在张孝祥老师-带有抽象方法的枚举中,定义了一个枚举:大概内容
class EnumTest {

public enum Trafficlamp{
       RED(30) {         //匿名内部类的格式是 new 父类构造器(){。。。。}
                 public TrafficLamp nextLamp(){
                            return GREEN;
                          }
               },
      GREEN(45){
                  
             public TrafficLamp nextLamp(){
                            return GREEN;
                          }
                };

       public abstract TrafficLamp nextLamp();
       private int time;
       private    TrafficLamp (int time) {this.time = time}//私有构造函数
  
    }

}
类文件结构
EnumTest$TrafficLamp$1.class代表RED
EnumTest$TrafficLamp$2.class代表GREEN
由此可见确实是两个匿名内部类。

其中,1): RED(30) {    }, 中匿名内部类创建匿名子类对象的话,在这里应该是
RED= new TrafficLamp(30){....};//RED是参数列表中的,不需要在指定其类型。
RED这里没有使用new 父类的构造器,而是用了一个RED()的写法,是怎么个用法。 枚举中的元素列表都是该类的实例,那么是不是可以认为 RED =new TrafficLamp,RED这个实例直接替代new这个写法?如果是这样,那在枚举以外的匿名内部类里面是否也可以这样写?先定义个实例引用比如:
Person person1;  person1(){....};  在枚举以外这样写可以么??
    2) RED(30){...}后面用的是逗号不是分号,是因为在元素列表里固定 要这样写么?

以上是两个疑问,有点晕,求指教~{:2_41:}

8 个回复

倒序浏览
本帖最后由 魏群 于 2012-3-18 16:05 编辑

{:soso_e100:}

点评

new Test1(){}还有,我想说,您这个并不是匿名内部类,而只是创建了TEST外部类TEST1的一个匿名对象,TEST的匿名内部类应该new TEST(){};  发表于 2012-3-18 16:05
回复 使用道具 举报
魏群 发表于 2012-3-18 16:04
刚翻了翻书,是我记错了。不好意思误导你了。呵呵。

哥们能回答就感谢你了,你也是在帮我么,互相学习么。可是哥们你得复习下匿名内部类的用法啊,你写那个不是匿名内部类牙
回复 使用道具 举报
本帖最后由 崔岩 于 2012-3-18 15:53 编辑
魏群 发表于 2012-3-18 15:28
先回答问题2 后面跟的是,号
比如 这些SPRING,SUMMER,FALL,WINTER;枚举值代表了Session类可能的实例。
为题 ...


按您的说法SPRING不是session的一个实例么?如果不是,那spring.getClass().getSuperclass().getName()就应该不对啊,类怎么能.getClass。枚举里装载的不就是对象么,而且张老师例子里抽象方法的返回值就是 TrafficLamp类型的对象,而里面return的是 GREEN(枚举值)
spring.getClass().getSuperclass().getName()这里spring.getClass()后得到的是Session,之后再getSuperclass后获得的必然是enum,因为Spring是Session类型的一个对象,SPRING并不是类。 您要证明session的父类是enum想说明什么问题我看不大懂。而且我的例子里面,RED(30){。。}是在枚举内部创建了一个匿名内部对象,对于单纯的 RED(30)能明白是传参数,但是在枚举内用匿名内部类时候就不用new 类名了么?枚举内按传统的匿名内部类格式写不可以么?
回复 使用道具 举报
刚翻了翻书,是我记错了。不好意思误导你了。呵呵。:lol
回复 使用道具 举报
本帖最后由 段浩亮 于 2012-3-18 16:36 编辑

你要是明白张老师讲枚举之前的那个模拟的例子的话 就很容易明白原因了
TrafficLamp 里面有抽象方法,新建子类对象时必须复写抽象方法,RED(30)就相当于
       new TrafficLamp (30){
               复写内弄
       } 这是一个匿名内部类  再把它赋给TrafficLamp RED
因此 RED(30) {        
        public TrafficLamp nextLamp(){
                  eturn GREEN;
        }
  },这种写法就相当于把上面的写法
第二个问题中RED(30){...}就相当于枚举的一个元素,元素之间用必须用","分隔开
回复 使用道具 举报
崔岩 中级黑马 2012-3-18 16:31:42
7#
段浩亮 发表于 2012-3-18 16:23
你要是明白张老师讲枚举之前的那个模拟的例子的话 就很容易明白原因了
EnumTest 里面有抽象方法,新建子类对 ...

您的意思是说 RED(){} 处的匿名内部类,继承的不是TrafficLamp 而是EnumTest么?? 我能明白你说的简写意思,就是不知道真相是不是这样,如果不缩写好使么
回复 使用道具 举报
崔岩 发表于 2012-3-18 16:31
您的意思是说 RED(){} 处的匿名内部类,继承的不是TrafficLamp 而是EnumTest么?? 我能明白你说的简写意 ...

sorry 我写错了,继承的是TrafficLamp
回复 使用道具 举报
段浩亮 发表于 2012-3-18 16:37
sorry 我写错了,继承的是TrafficLamp

你把简写格式当成固定语法看就行了,内部怎么实现的没必要清楚.
就像高级for循环一样,只管拿来用,底层是怎么实现的跟我们没关系
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马