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

final的困惑
public class finalTest
{
public static void main(String[] args)
{
final String book = "测试:"+ 99.0;

final String book2 = "测试:"+ String.valueOf(99.0);

System.out.println(book == "测试:99.0");
System.out.println(book2 == "测试:99.0");
}
}

麻烦大家给我分析分析 为什么输出为true,false

------解决方案--------------------
final String book = "测试:"+ 99.0; //编译优化,在编译期就自动把"测试:"+ 99.0编译为"测试:99.0"作为常量池的常量对象,book指向常量池的常量对象

final String book2 = "测试:"+ String.valueOf(99.0); //编译期把"测试"编译为常量池的常量对象,String.valueOf(99.0)编译为一个方法的返回值由运行期决定,所以book2指向两个字符串对象的相加结果所确定的对象
所以
System.out.println(book == "测试:99.0"); //book指向常量池的"测试:99.0"常量对象,
//所以==为ture,即book所引用的对象就是常量对象"测试:99.0"
System.out.println(book2 == "测试:99.0");//book2没有指向常量池的"测试:99.0"常量对象,
//所以==为false,book2所引用的对象和常量对象"测试:99.0"不是同一个对象
 



------解决方案--------------------
这是上面的输出结果

true
false
false

------解决方案--------------------
字符串池 如果池中已有一模一样的对象,则直接引用到相同内存地址。