日期:2014-05-20  浏览次数:20648 次

Java对象引用问题?
请先看这段简单的程序:
public   class     test
{
public   static   void   temp(String   a)
{
a=a+ "888 ";
System.out.println(a);
}
public   static   void   main(String[]   args)  
{
String   abc=new   String( "Test   a   object ");
test.temp(abc);
System.out.println(abc);
}
}

String到底是对象,还是一种类型,如果说是类型那么调用temp方法就应是值传递,那么输出结果就是正确的。
但问题是很多书上都说String是一个对象,那么我在main下创建一个string对象的实例,它的传递就应该是对象引用
那么从理论上来讲输出结果就应该是 "Test   a   object888 "才正确。

哪位高人能真正说明一下这个问题到底是怎么回事?

------解决方案--------------------
没错~String是一个类!传递是引用
a=a+ "888 "; 这里创建了一个新的String
用a来因用 “Test a object888”
原来abc还是引用“Test a object”


------解决方案--------------------
我想我没办法说得比楼上说的好了
------解决方案--------------------
建议楼主看《thinking in Java》的“一切都是对象”这一章,里面讲的很明确了。看书要看经典的
------解决方案--------------------
JAVA 一切都是对象呀 一楼说的很好
------解决方案--------------------
String 只是一个JAVA常用类..

它在参数传递中传递的是引用的副本....而非引用...

一楼有没有弄错...如果传递的是引用的话....abc的值就被改变了



------解决方案--------------------
难道楼上的不知道String是常量么?
------解决方案--------------------
我想楼主之所以产生疑问是因为Java对String的处理貌似和普通对象有些不一样。对于普通的非基本类型的对象(比如int),是不能使用“+”运算符的。当String作为操作数时,“+”运算符被重载,这其中有个过程,我自己猜测是这样的:
1、首先把两个操作数(就是‘+’左右两侧的String)都分别转换成为StringBuffer,A和B;
2、创建一个新的StringBuffer对象C,然后把通过操作数创建的两个StringBuffer都append进去;
3、将C转换成为String作为运算结果;
所以,照上面的过程分析,就知道为什么main中的System.out.println(abc);结果是“Test a object”而不是“Test a object888”了。
------解决方案--------------------
我同意tomkai(我不是苹果) 的
------解决方案--------------------
代码中的a和abc都是String类型,但是他们引用不同的对象的引用,指向堆栈中不同的内存空间.一个指向 "Test a object ",另一个指向 "Test a object888 ",互不影响.
------解决方案--------------------
a=a+ "888 "; // 在这里你已经修改了a的指向,a变成了一个全新的对象,与原来的对象没有关系,而这个指向的改变并不会改变main方法中的a指向


所以外部的a还是This is an object
------解决方案--------------------
Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
String abc=new String( "Test a object ");
这里是创建了两个对象,一个是“Test a object”,一个是指向“Test a object”的引用对象abc.这样解释应该懂了吧.
------解决方案--------------------
这里存在一个问题,就是java中,String对象是不可修改的,那么在Test a object 这个String一旦存在以后,就不可改,所以,a=a+ "888 "; 这句只是又新建了一个String对象,内容是Test a object888,并把a指向它,而原来的Test a object 并没有改变,abc仍然指向它.lz可以把代码中的String换成StringBuffer试试,得到的结果会让你有新的理解.