A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM张健 中级黑马   /  2013-3-15 09:19  /  2527 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM张健 于 2013-3-15 12:52 编辑
  1. public class TestFinal2{
  2.    
  3.     public static void main(String[] args){
  4.         
  5.         final String str1 = "黑马";
  6.        final String str2 = "程序员";   
  7.         
  8.         String str3 = str1 + str2;
  9.         String str4 = str1 + str2;
  10.         System.out.println(str3 == str4);
  11.         
  12.    
  13.       String str5 = "黑马" + "程序员";
  14.         String str6 = "黑马" + "程序员";
  15.         System.out.println(str5 == str6);
  16.       
  17.         }

  18.     }
复制代码

为什么final修饰的str1和str2后str1 ==str2返回值为true不是应该为false么


评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

6 个回复

倒序浏览
str1 和str2两个变量本身的值并没有改变
只是他们加起来的结果指向了另外一个变量“黑马程序员”
而在做str4赋值的操作时  由于缓冲区里已经有了 “黑马程序员”这个变量了
所以在这里不新创建字符串而是指向已创建好的字符串变量 “黑马程序员”
所以他没两个地址相等 即str3 == str4
str5与str6同理

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
首先说一下final的特点:
1.可以修饰类、变量、函数
2.被final修饰的类不能被继承,为了避免被继承,被子类复写
  例如:final class Demo{}
3.被final修饰的方法不可以被复写。例如 final void show(){}
4.被final修饰的变量为常量只能赋值一次,既可以修饰成员变量,也可以修饰局部变量,常量所有字母都大写,多个单词间通过_连接。全局常量 public static final double PI=3.14
5.内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量
楼主你比较的是str3==str4,没有比较str1==str2;因为被final修饰的变量其实是常量而且只能赋值一次,所以str1和str2的值在赋值后就不能改变了,如果比较str1==str2的话,结果就为fasle,而str3和str4都是str1和str2相连接而成的,所以str3="黑马程序员",str4="黑马程序员",所以str3==str4为true,str5==str6我就不说了,相信楼主你明白的,此外提醒楼主因为被final修饰的变量其实是常量,常量所有字母都是要大写的。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
str1 ==str2 是false 没错。
你程序运行结果的两个true是
System.out.println(str3 == str4);
System.out.println(str5 == str6);
.

至于str3==str4 是因为str3的内容为“黑马程序员”,String类型,会被保存在全局数据区.str4的内容也是“黑马程序员”——str4的内存首地址指向str3的内存首地址,所以通过 “==” 比较出来的结果是true。

str5==str6的道理一样

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
被final修饰以后str1和str2就都变成常量了,也就是说,str1就是“黑马”且不会变,str2就是“程序员”且不会变。str1+str2就相当于“黑马”+“程序员“,str1+str2永远指向内存中相同的地址,所以str3==str4返回true。如果去掉final修饰符,就会返回false了。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
String 是引用类型,所以指向的是地址值(引用传递),而str1和str2虽然也是String类型,但被final修饰,变成了常量,是基本类型的使用,是值传递,即str1==str2是false,而str3和str4等于str1+str2,所以str3==str4是true,当“黑马程序员”已经存在缓冲区后,所有引用都指向了相同的栈内存地址值,比较的值都是true,如str3==str5。代码演示:
  1. final String str1 = "黑马";
  2.        final String str2 = "程序员";
  3.       
  4.        String str3 = str1+str2;
  5.        String str4 = str1+str2;
  6.        System.out.println(str3==str4);//true
  7.       
  8.        String str5 = "黑马" + "程序员";
  9.        String str6 = "黑马" + "程序员";

  10.         System.out.println(str5 == str6);//true
  11.         System.out.println(str3==str5); //true
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
ok啦  问题解决 完毕
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马