final修饰成员变量必须显示初始化,可是这跟s6有关系吗?

解决方案 »

  1.   

    final指向引用数据也就是String类的时候,他指向变量的地址是不会改变的。
    == 对于数字来说是比较其大小,而对对象来说,比较的是引用地址。
    像 “hello”,"world"这些字符串存放在常量池里面,当s4,s5声明的时候,他会先去常量池里面找,找不到才在常量池里创建。因为之前s1,s2创建的时候已经声明,所以s4,s5直接获取到常量池中的地址。如果你比较下会发现s1 == s4, s2 == s5是true。这和final 修饰没多大关系。
    同时s3进行+字符串的拼接,本质是调用了StringBulider这个类的append方法
    而s6再次进行拼接的时候,因为s4,s5被final修饰,s6同时也被默认声明为final 修饰,s4,s5拼接的结果是helloworld ,所以将直接找到s的地址,返回给s6,这时候s6 和s的地址是相同的,所以==比较的时候就返回true了。以上观点只是我的个人理解和猜想
      

  2.   

    的确跟final有关系,不加final就是false,
      

  3.   


    final会吧数据放入常量池,让后传递给变量的是常量池中的地址,所以运算也会在常量池中进行,相当于进行了基本类型的运算。基本类型可以直接用==比较,常量池中值相等必定地址相等。而普通的string变量被赋予相当于new ,所以普通的string无法用==来比较。