public class Elvis {
// Recursive class initialization
public static final Elvis ELVIS = new Elvis();
private Elvis() {
//System.out.println(ELVIS.LIVING);
}
private static final boolean LIVING = true; // Too late
private final boolean alive = LIVING;
public final boolean lives() { return alive; }
public static void main(String[] args) {
System.out.println(ELVIS.lives()? // Autounboxing!
"Hound Dog" : "Heartbreak Hotel");
}
为什么输出结果是Hound Dog?
解决方案 »
- 新手关于“this“的问题
- 形如:(a1|a2)*(b1|b2)展开算法
- 我想实现在一个TextField里面输入诸如202.118.75.71这样的IP地址,点击一下一个“查找主机名”的按钮就在一个Label里面显示对应的主机名
- 不知java有没有象BCB那样的TDBGrid或TDBEdit一样的数据库元件?
- 入门新手看不懂输出结果求解答
- 关于内部类的一些问题。【静态成员类】【成员类】【局部类】【匿名类】的用法?
- 方法里面定义的对象的生命周期是多长?
- applet中,可以有多个CLASS吗?其中一个是继承于APPLET,其他的被他所使用.在HTML中应该怎么写?是不是所有的CLASS都要写上去?
- 有研究过FOP这个软件的大虾看过来,小弟这儿分的多多的有
- 一个关于JDBC的问题,用到SQL或Access 。一个初学者向各位师兄请教。
- java 正则表达式 捕获组--2
- 没有后缀名的文档如何识别?
ELVIS.lives()? "Hound Dog" : "Heartbreak Hotel"
这句就是如果ELVIS.lives()为真输出Hound Dog ,为假输出Heartbreak Hotel
执行:public static final Elvis ELVIS = new Elvis();
构造new Elvis()对象
执行:private final boolean alive = LIVING;
此时的LIVING还没有初始化,保持其默认值false
接着执行:private static final boolean LIVING = true;
类初始化完毕
main函数中调用ELVIS.lives()的时候,返回的应该是false,怎么会是true呢?jdb单步执行的结果:
public static final Elvis ELVIS = new Elvis();private Elvis() {private final boolean alive = LIVING;}public static final Elvis ELVIS = new Elvis();System.out.println(ELVIS.lives()? // Autounboxing!public final boolean lives() { return alive; }System.out.println(ELVIS.lives()? // Autounboxing!
时就已经把alive赋为true了。
如果把final去掉就如同LZ在一楼所说的了
如果类仅包含静态final变量的类变量初始化语句,并且这些类变量初始化语句采用编译时常量表达式,类就不会有<clinit>方法。
例子中,private static final boolean LIVING = true; 这里的LIVING是常量,而非类变量
用jad返编译生成的class可以看到:
public final boolean lives()
{
return true;
}
代码中是直接嵌入的true的字面值。
goldenfish1919说的有道理