黑马程序员技术交流社区

标题: 枚举初始化的问题 [打印本页]

作者: 谢洋    时间: 2013-2-24 10:28
标题: 枚举初始化的问题
本帖最后由 谢洋 于 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;
                }
        }
}

作者: 谢波    时间: 2013-2-24 10:48
你的打印语句是放在nextLamp()方法里的
你根本都没有调用nextLamp方法,那怎么会打印呢?
如果把打印语句加到你的构造方法里,那么加载类的时候就会打印了
作者: 逍林游    时间: 2013-2-24 10:48
你的public enum TrafficLamp{·····没有重写toString()方法。怎么会有信息打印呢!

作者: 贾振凯    时间: 2013-2-24 11:42
本帖最后由 贾振凯 于 2013-2-24 12:01 编辑

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


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

    看了上面的回答我发现我这个回答驴唇不对马嘴哈!羞涩中。。。。。。。。。。。。。。
作者: 陈科宇    时间: 2013-2-24 13:43
楼主这不是搞笑么,你只是单个实例重写了方法,有没调用,怎么可能打印。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2