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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢洋 高级黑马   /  2013-2-24 10:28  /  1668 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 谢洋 于 2013-2-25 10:34 编辑

package cn.itcast.test;
/**
* 复杂的枚举类
* 为什么加载时没有执行成员子类的打印语
*/
public class EnumTest {

        
        public static void main(String[] args) {
                TrafficLamp yellow = TrafficLamp.YELLOW;
                System.out.println(yellow.toString());
        }

        public enum TrafficLamp{
        
                //通过子类完成子类对象实例
                //并且调用父类的有参构造方法
                //子类必须完成父类的构造方法
                RED(30){ //private static final RED()//这不是静态的?类加加载时为什么没有执行打印语句?
                        public  TrafficLamp nextLamp(){
                                System.out.println("red");
                                return GREEN;
                        }
                },
                GREEN(45){
                        public  TrafficLamp nextLamp(){
                                System.out.println("green");

                                return YELLOW;
                        }
                },
                YELLOW(5){
                        public  TrafficLamp nextLamp(){
                                System.out.println("yellow");
                                return RED;
                        }
                };
                public abstract TrafficLamp nextLamp();
                private int time;
                private TrafficLamp(int time){//隐式的static
                        this.time = time;
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
你的打印语句是放在nextLamp()方法里的
你根本都没有调用nextLamp方法,那怎么会打印呢?
如果把打印语句加到你的构造方法里,那么加载类的时候就会打印了

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你的public enum TrafficLamp{·····没有重写toString()方法。怎么会有信息打印呢!
回复 使用道具 举报
本帖最后由 贾振凯 于 2013-2-24 12:01 编辑

我是这样认为的:
    在这个枚举类中,枚举值是作为匿名内部类实例存在的,由于默认使用public static final 修饰,所以他们属于EnumTest 类的静态属性,而在类加载过程中的初始化阶段(类加载其实分为类的加载,类的连接,类的初始化三个阶段,只是我们一般统称为类的加载活着类的初始化)主要就是完成对静态属性的初始化,但是这种初始化是有讲究的,在下面六种情况下会系统会初始化相应类或者借口:
   1、创建实例  
   2、调用类的静态方法   
   3、访问类或接口的静态属性,或为静态属性赋值   
   4、使用反射方式来强制创建某个类或接口的java.lang.Class 对象
   5、初始化某个类的子类,会导致其祖先类的初始化
   6、直接使用java.exe来运行某个主类,会先初始化该主类


   但是有一种情况很特殊!
   对于一个final型的静态属性,如果该属性可以在编译时就得到属性值,则不会导致类的初始化,而是当成常量使用,试想一下,我们使用枚举值时不就是是作为常量使用的吗?

    看了上面的回答我发现我这个回答驴唇不对马嘴哈!羞涩中。。。。。。。。。。。。。。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主这不是搞笑么,你只是单个实例重写了方法,有没调用,怎么可能打印。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马