您的位置:程序门 -> java -> j2se / 基础类



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


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


通过引用操作对象会改变引用本身吗?
发表于: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   了呢?
不还都是引用了同一个对象吗?

发表于:2007-02-01 10:00:281楼 得分:0
http://blog.csdn.net/whzresponse

这里面有一篇文章,你去看看就知道了!
发表于:2007-02-01 10:02:352楼 得分:0
应该用equals比较吧,java的书里面都重点的讲了这方面的东西,好好看看。
发表于:2007-02-01 10:06:083楼 得分:0
大家看一下你是否知道下面的是输出结果:
  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);//   ⑦
        }
发表于:2007-02-01 10:06:364楼 得分:0
如果不知道还请看http://blog.csdn.net/whzresponse
发表于:2007-02-01 10:14:495楼 得分:0
false
true
false
true
true
false
false
应该是这个结果吧......
发表于:2007-02-01 10:32:036楼 得分:0
java中的 "引用 "与c++中不同,java中的 "引用 "是用在对象上的.
再说 "== "并不是引用,而是赋值.   (我是这么理解的)
发表于:2007-02-01 10:32:537楼 得分:0
打错了   把 "== "   改为 "= ".
发表于:2007-02-01 11:07:098楼 得分:0
通过引用操作对象会改变引用本身吗?  
================================
首先,答案肯定是   会。

之所以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错了,有没有高人指点为什么错了。
请明确指点,不要再叫我看什么资料了,谢谢。
发表于:2007-02-01 11:11:389楼 得分:0
6   7     没有错就是false
发表于:2007-02-01 16:40:3510楼 得分:0
首先我觉得太追究这个东西没什么必要,判断值相等用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.


快速检索

最新资讯
热门点击