黑马程序员技术交流社区

标题: 关于Java 引用类型的问题 [打印本页]

作者: quick3g    时间: 2014-12-3 15:01
标题: 关于Java 引用类型的问题
String s1="haha";
String s2="haha";
String s3="ha"+"ha";
System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s1==s3);//此处为何:true呢?

假设有一个类:
class Book{
        public int id=0;
        public String name="itheima";
}

两个方法:
public static Book changeBook1(Book b){
                b.id=2;b.name="itcast";
                return b;
}
public static Book changeBook2(Book b){
                b=new Book();
                b.id=3;b.name="CSDN";
                return b;
}

                  //测试:
                 Book b0=new Book();
                 System.out.println("book.id="+b0.id+"\tbook.name="+b0.name);//初始化后的Book对象
                 Book b1=changeBook1(b0);//更改Book对象的值
                 System.out.println("book.id="+b0.id+"\tbook.name="+b0.name);
                 System.out.println(b0==b1);//此处为何为true???
                 Book b2= changeBook2(b0);//更改Book对象的值
                 System.out.println("book.id="+b0.id+"\tbook.name="+b0.name);
                 System.out.println(b0==b2);//此处为何为false???


作者: 大大的心    时间: 2014-12-3 15:58
在字符串中的 + 指的是将两端字符串连起来。这里的 + 不同平时我们使用的 +,

字符串中的 + 的使用:

作者: 大大的心    时间: 2014-12-3 15:59
在字符串中的 + 指的是将两端字符串连起来。这里的 + 不同平时我们使用的 +,

字符串中的 + 的使用:
      " I love u !!!!"      = "I love" +" u !!!!"

只是一个连接的作用。

如果字符串很长很长,那么,用+可以实现换行,这样代码更加具有阅读性。
作者: 人比黄瓜瘦    时间: 2014-12-3 21:42
+号是连接符吧,把两个ha连在了一起
作者: caobin    时间: 2014-12-3 21:53
我看字符串发现一个技巧,就是记住这句话, “ 字符串在定义后无法被改变 ”,就能解决很多问题了。像楼主问的“ha"+"ha"==“haha”.是不是可以这样想 ,因为“ha”+“ha”生成了一个新字符串,但是这个字符串在内存里又已经有了,所以s3就自动使用了“haha”在内存中的地址值,所以s1==s3就为true了。
作者: Mr.Ni    时间: 2014-12-3 22:08
String s1="haha";在字符串常量池中建立一个内容为hahad的对象,s1指向该地址
String s2="haha";字符串中常量池已经有一个内容为hahad的对象,不在建立新的对象,s2指向该地址
String s3="ha"+"ha";两个字符串合并成一个新的字符串,在字符串常量池中已有,不再创建,s3同上
所以,s1,s2,s3指向了同一个对象
b0==b1,在调用changeBook1方法的时候,传进去的是第一个对象的地址值,在该对象身上进行了赋值操作,再把该对象的地址值赋给了b1,虽然对象内容改变了,但地址值没变。
b0==b2,在changeBook2中,虽然传入了第一个对象的地址值,但新建了一个对象后覆盖了该地址值(被调用的函数内的形参改变了,调用者的实参没有改变),这样就是在新的对象上进行操作,最后把新对象的地址值赋给了b2,这样b2和b0指向了不同的对象。
作者: 杨佳名    时间: 2014-12-4 00:37
http://bbs.itheima.com/thread-152431-1-1.html好像都没说到点子上。。。希望对你有帮助
作者: quick3g    时间: 2014-12-4 01:58
杨佳名 发表于 2014-12-4 00:37
http://bbs.itheima.com/thread-152431-1-1.html好像都没说到点子上。。。希望对你有帮助 ...

很详细,谢谢。:),




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2