通过引用操作对象会改变引用本身吗?

tgh_china 2007-02-01 09:45:17
public class Test {

public static void main(String [] args)
{
String a=new String("aaa");
String b=new String("bbb");
b=a;
System.out.println(a==b);
a=a+"";
System.out.println(a==b);


System.out.println(a);
System.out.println(b);
}
}


为什么对a 操作之后 a==b 就是 false 了呢?
不还都是引用了同一个对象吗?

...全文
380 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
msnsnd 2007-02-01
  • 打赏
  • 举报
回复
6 7 没有错就是false
luyang1016 2007-02-01
  • 打赏
  • 举报
回复
通过引用操作对象会改变引用本身吗?
================================
首先,答案肯定是 会。

之所以lz的实验得到这样的结果,是因为String类型本身比较特殊。
举个简单的例子
String a = "1";
String b = "2";
b = a;
a = a + "love";
最基本的: b = 2 ; a = 1love。
有时候问题就是这么简单。
============================================================
大家看一下你是否知道下面的是输出结果:
public static void main(String[] args) ...{
String str1 = "abc";
String str2 = new String("abc");
String str3 = new String();
String str4 = new String("");
System.out.println(str1 == str2);// ① false
System.out.println(str1.equals(str2));// ② true
System.out.println(str3 == str4);// ③ false
System.out.println(str3.equals(str4));// ④ true
String str5 = "a";
String str6 = "b";
String str7 = "ab";
String str8 = "a" + "b";
String str9 = "a" + str6;
System.out.println(str7 == str8);// ⑤ true
System.out.println(str7 == str9);// ⑥ true
System.out.println(str7 == str5 + str6);// ⑦ true
}
==========================================================
用eclipse跑了一下,发现错了2个, 6和7错了,有没有高人指点为什么错了。
请明确指点,不要再叫我看什么资料了,谢谢。
sDuma 2007-02-01
  • 打赏
  • 举报
回复
打错了 把"==" 改为"=".
sDuma 2007-02-01
  • 打赏
  • 举报
回复
JAVA中的"引用"与C++中不同,JAVA中的"引用"是用在对象上的.
再说"=="并不是引用,而是赋值. (我是这么理解的)
msnsnd 2007-02-01
  • 打赏
  • 举报
回复
false
true
false
true
true
false
false
应该是这个结果吧......
汪老实 2007-02-01
  • 打赏
  • 举报
回复
如果不知道还请看http://blog.csdn.net/whzresponse
汪老实 2007-02-01
  • 打赏
  • 举报
回复
大家看一下你是否知道下面的是输出结果:
public static void main(String[] args) ...{
String str1 = "abc";
String str2 = new String("abc");
String str3 = new String();
String str4 = new String("");
System.out.println(str1 == str2);// ①
System.out.println(str1.equals(str2));// ②
System.out.println(str3 == str4);// ③
System.out.println(str3.equals(str4));// ④
String str5 = "a";
String str6 = "b";
String str7 = "ab";
String str8 = "a" + "b";
String str9 = "a" + str6;
System.out.println(str7 == str8);// ⑤
System.out.println(str7 == str9);// ⑥
System.out.println(str7 == str5 + str6);// ⑦
}
msnsnd 2007-02-01
  • 打赏
  • 举报
回复
应该用equals比较吧,java的书里面都重点的讲了这方面的东西,好好看看。
汪老实 2007-02-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/whzresponse

这里面有一篇文章,你去看看就知道了!
bluesmile979 2007-02-01
  • 打赏
  • 举报
回复
首先我觉得太追究这个东西没什么必要,判断值相等用equal,判断引用地址想等都用==,我想对象比较一般也不会用到==,用到的时候也不会像上面测试那样复杂,没人愿意浪费可读性写那种自己读起来都闹心的程序的。

另外简单说说这个问题。

String有两种生成对象的方法

String="****";
String=new String("");

另外要明确一点,String虽然是个对象,但是它有很多基本数据类型的特点,所以它是用不可变模式做成的,就是说你不可能通过函数改变一个String本身的情报。当你想要改变的时候,string本身并没有被你改变,他会返回一个新的string对象给你使用。而你想要修改的sting对象本身还是存在并且没有被修改的

当使用String="****"的时候,java会把生成的对象作为一个常量保存在常量池中
当使用String="****"的时候,java会首先查找常量池中是否已经存在,如果存在则引用指向常量池中对应对象,如果不存在,则生成新的对象保存在常量池中。
当使用形如String="***"+"*****"同上。

正因为string是不可变模式,所以java才可以使用上面的处理,来优化我们的代码,比如减少内存使用

当使用String = new String();系统会无条件开辟新的内存来保存对象。
当使用形如string=""+str,String=str+"",String=str+str,系统都会无条件开辟新的内存来保存对象。

==比较的是是否使用同一块内存,equal比较的是内存中存放的东西是不是一样的。

以上,应该可以判断出什么时候是true,什么时候是false.

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧