日期:2014-05-20  浏览次数:20574 次

求教大神两个关于String常量的程序输出问题!


这个程序输出的是true

这个输出的是false ,求这两个程序各自对字符串常量的赋值方式为什么使结果不一样?
------解决方案--------------------
好绕啊。。
个人的简单理解是这样的:
第一个情况是因为在执行静态方法main的时候,常量A、B明确,因此等同于"ab"+"cd"操作。
第二个情况,在执行静态方法main的时候,常量A、B不明确,通过执行static静态块的时候得到,此时A、B被当做变量处理了,效果等同于:
String A = "ab";
String B = "cd";
String s = A+B;
...
------解决方案--------------------
第一个在编译期就已确定了,第二个只能通过运行后才能确定,所以是两个全新的对象
------解决方案--------------------
我的理解是这样的:
第一个例子输出为true,是因为第一种写法在编译期间就可以确定String s的值了,因为A,B都是用final修饰的。所以String s会放到常量池
而第二个例子中A,B都是放在静态初始化块中的,静态初始化块是当这个类第一次被JVM加载的时候执行的。
而第一次被JVM加载是运行时的时候了,所以不会放到常量池中。所以为false.