其实它们输出的值是一样的,只是比较的方法不一样,导致一个是true一个是false,用equals比较的话,输出的都是true

解决方案 »

  1.   

    第一个true的原因是 字符常量取已经存在了 abcd的对象。在String t="abcd";的时候就不会再创建新的对象所以两个引用是相等的。
      

  2.   

    第二个 就是两个全新的对象了,肯定是false了
      

  3.   

    好绕啊。。
    个人的简单理解是这样的:
    第一个情况是因为在执行静态方法main的时候,常量A、B明确,因此等同于"ab"+"cd"操作。
    第二个情况,在执行静态方法main的时候,常量A、B不明确,通过执行static静态块的时候得到,此时A、B被当做变量处理了,效果等同于:
    String A = "ab";
    String B = "cd";
    String s = A+B;
    ...
      

  4.   


    +1http://www.coderanch.com/t/454384/java/java/compile-time-constant
      

  5.   

    javap看一下字节码就知道怎么回事了
      

  6.   

    我的理解是这样的:
    第一个例子输出为true,是因为第一种写法在编译期间就可以确定String s的值了,因为A,B都是用final修饰的。所以String s会放到常量池
    而第二个例子中A,B都是放在静态初始化块中的,静态初始化块是当这个类第一次被JVM加载的时候执行的。
    而第一次被JVM加载是运行时的时候了,所以不会放到常量池中。所以为false.