常量的编译 博客分类: PUZZLE
程序员文章站
2024-02-20 21:20:52
...
public class PrintWords { public static void main(String[] args) { System.out.println(Words.FIRST + " " + Words.SECOND + " " + Words.THIRD); } } public class Words { private Words() { }; // Uninstantiable public static final String FIRST = "the"; public static final String SECOND = null; public static final String THIRD = "set"; }
现在假设你像下面这样改变了那个库类并且重编译了这个类,但并不重编译客户端的程序:
public class Words { private Words() { }; // Uninstantiable public static final String FIRST = "physics"; public static final String SECOND = "chemistry"; public static final String THIRD = "biology"; }
此时,客户端的程序会打印出什么呢?
一个常量变量的定义是:一个在编译期被常量表达式初始化的final的原始类型或String类型的变量[JLS 4.12.4]。在知道了这些知识之后,我们有理由认为客户端程序会将初始值Words.FIRST, Words.SECOND, Words.THIRD编译进class文件,然后无论Words类是否被改变,客户端都会打印the null set。
运行了程序,你会发现它打印的是the chemistry set。
关键是null不是一个编译期常量表达式
推荐阅读
-
Tcl 中的方括号和大括号 博客分类: Tcl
-
用 Tcl 做测试所存在的一个严重问题 博客分类: Tcl tcl
-
常量的编译 博客分类: PUZZLE
-
在构建单一 Jar 包时,Maven Assembly 和 Shade 插件的不同之处 博客分类: 开源框架
-
(转贴)flickr对javascript干的好事 博客分类: javascript JavaScriptCSS应用服务器PHP浏览器
-
偶尔听到了一首有趣的歌 博客分类: 生活 游戏音乐
-
一个 Java SE 7 Fork/Join 的小例子 博客分类: Java Fork/JoinJava SE 7
-
在构建单一 Jar 包时,Maven Assembly 和 Shade 插件的不同之处 博客分类: 开源框架
-
java 整合Ucenter (authcode)函数的算法 博客分类: java 算法JavaJ#SecurityC++
-
LDAP 中 CN, OU, DC 的含义 博客分类: 其它 MicrosoftHTML