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

解决方案 »

  1.   

    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"不是同一个对象
     
      

  2.   

    final 修饰的属性不是常量  
    static final修饰的属性才是常量
    所以你这里用==比较的  不仅仅是字符串相等还得比较地址的值是否相等
    第一个book地址接收的是 字符串加double型后的值
    第二个book2会在堆内存新开辟一个地址接  字符串加转换成String后的double值
    虽然两个地址里的字符串都相等 但是用==比较因为地址不等所以false  
    如果你book2用 equals比较 就是true
      

  3.   

    确实是和final没有任何关系。
      

  4.   

    public class asd
    {
    public static void main(String[] args)
    {
     String book = "测试:"+ 99.0; String book2 = "测试:"+ String.valueOf(99.0);System.out.println(book == "测试:99.0");
    System.out.println(book2 == "测试:99.0");
    System.out.println(String.valueOf(99.0) == "99.0");
    }
    }
    这是答案   和final 没关系
      

  5.   

    这是上面的输出结果true
    false
    false
      

  6.   

    我明白了  上面的这个程序应该和final没关系,是和字符串池有关系                  String s1 = "test"+" final";
    String s2 = "test final";
    final String s3 = "test";
    final String s4 = " final";
    String s5 = s3+s4;

    System.out.println(s1==s2);
    System.out.println(s1==s5);这个就和fianl有关系了?final在这里是变量宏吧!!!
      

  7.   

    final 作用于变量值报名变量不可变。
    楼主理解挺快