读书人

final的困惑解决思路

发布时间: 2012-04-28 11:49:53 作者: rapoo

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

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

读书人网 >J2SE开发

热点推荐