黑马程序员技术交流社区
标题:
枚举初始化的问题
[打印本页]
作者:
谢洋
时间:
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