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?
解决方案 »
- 怎样使用runtime的exec函数来打jar包??
- AWT登录界面连接数据库问题
- 急求 公园租车 思路或 代码
- java swt win32 访问注册表
- 如何检测程序运行中产生的线程的状态?
- 不是说JAVA中没有模板么 >>> public interface Collection<E> extends Iterable<E> <<<???怎么解释呀 详细点吧
- 在线等! 初始化imageicon为资源中的01.jpg图片,但是出现在问题。大家帮忙解决!!!
- 为什么我启动applet总是要启动jre才能正常运行,我没有用swing的东西啊?
- 用editplus的兄弟进来
- 有用代码生成工具(R-O Map)的吗?交流交流。
- 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说的有道理