老问题老。为什么会是这样呢?

pausermake 2008-09-19 11:52:41
public class StringTest {
public StringTest() {
}
public static void main(String[] args) {
StringTest temp = new StringTest();
String a = new String("bbbbbbbbbbb");
temp.change(a);
System.out.println(a);
}
public void change(String temp){
temp = "aaaaaaaaaaaa";
}
}

对于类型我知道他是引用。。但是为什么会输入bbbbbbbbbbb呢?
...全文
191 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
内存泄漏 2008-09-20
  • 打赏
  • 举报
回复
因为是按值传递,不是按引用..所以就是副本~ 只是说副本对象里面存的是地址罢了..所以在函数里面修改副本对象的成员变量有效是因为实际是对地址内的内容进行了修改..
pausermake 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 youzi530 的回复:]
只是对副本操作.所以并不能改变实体.
[/Quote]

String是引用类型。为什么会传递的是副本呢?
youzi530 2008-09-20
  • 打赏
  • 举报
回复
只是对副本操作.所以并不能改变实体.
pausermake 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tabby 的回复:]
是这样的..a中保存了字符串bbbbbbbbbbb的地址,调用change函数后,temp也保存了字符串bbbbbbbbbbb的地址,即两个对象指向同一字符串..当你执行temp = "aaaaaaaaaaaa"; 后,temp对象指向aaaaaaaaaaaa的地址.但a的指向不变..
[/Quote]


这个兄弟...按照你上面说的,那String传递的只是一个副本了哦?
但是如果这样的话我又晕了..
他是引用类型为什么传递的是副本呢?
pausermake 2008-09-20
  • 打赏
  • 举报
回复
还是没理解。如果String是引用类型他应该传递的是一个地址
我把那个地址从新引用了bbbbbbbbbbbb
那个地址的值就应该是bbbbbbb了。。
不解............
内存泄漏 2008-09-20
  • 打赏
  • 举报
回复
是这样的..a中保存了字符串bbbbbbbbbbb的地址,调用change函数后,temp也保存了字符串bbbbbbbbbbb的地址,即两个对象指向同一字符串..当你执行temp = "aaaaaaaaaaaa"; 后,temp对象指向aaaaaaaaaaaa的地址.但a的指向不变..
pausermake 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yinianshen 的回复:]
Java里除了传递数组参数是按地址传递的之外,其余类型的参数传递都是按值,也就是传引用。所以这里楼主通过change(String temp)方法,并不能改变原来的a的值(就是main函数里定义的那个String a = new String("bbbbbbbbbbb"); ),temp只是a的一个副本,change函数改变的也只是这个副本的值,跟原来a的值没关系.
[/Quote]

按照你的说法...除开数组是引用传递(传递的是地址),其他的全是值传递了哦(传递副本)
那我传递其他的类型就不会..比如说Vector....
pausermake 2008-09-20
  • 打赏
  • 举报
回复
对于引用类型来说...传递的应该是地址..既然是地址..我改变了当前地址的值...为什么却没有改变..
难道String类型 只是传递的副本?
  • 打赏
  • 举报
回复
Java里除了传递数组参数是按地址传递的之外,其余类型的参数传递都是按值,也就是传引用。所以这里楼主通过change(String temp)方法,并不能改变原来的a的值(就是main函数里定义的那个String a = new String("bbbbbbbbbbb"); ),temp只是a的一个副本,change函数改变的也只是这个副本的值,跟原来a的值没关系.
内存泄漏 2008-09-20
  • 打赏
  • 举报
回复
public void change(String temp){

上面的String temp只是a对象地址的一个拷贝..因此,改变temp指向的地址并不会影响a所指向的地址..
内存泄漏 2008-09-20
  • 打赏
  • 举报
回复
http://www.learndiary.com/archives/diaries/2713.htm
http://java.ccidnet.com/art/3737/20050527/472879_1.html
justinavril 2008-09-20
  • 打赏
  • 举报
回复
if you change change() to:
public String change(String temp){ 
temp = "aaaaaaaaaaaa";

return temp;
}


and

String a = change(a);
justinavril 2008-09-20
  • 打赏
  • 举报
回复
class field and method field...

temp belongs to method change(). So after running change(), temp is not available any more...So it cannot change the value of a...
ZangXT 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 chenxinhong98 的回复:]
不管你传的是什么,传过去的都只是一个副本而已,这个副本作为方法的局部变量保存在栈中。
如果传的是基本数据类型,修改这个值并不会影响作为参数传进来的那个变量,因为你修改的是方法的局部变量,是一个副本。
如果传的是一个对象的引用,也是一样的,也是一个副本,但是这个副本和作为参数传进来的那个引用指向的是内存中的同一个对象,所以你通过这个副本也可以操作那个对象。但是如果你修改这个引用本身,比如让他指向内存中的另外…
[/Quote]
一直支持这个说法。
不过想想,对于引用类型说成是传地址(或者类似C、C++)里的指针应该更容易理解。
酒浪子 2008-09-20
  • 打赏
  • 举报
回复
不管你传的是什么,传过去的都只是一个副本而已,这个副本作为方法的局部变量保存在栈中。
如果传的是基本数据类型,修改这个值并不会影响作为参数传进来的那个变量,因为你修改的是方法的局部变量,是一个副本。
如果传的是一个对象的引用,也是一样的,也是一个副本,但是这个副本和作为参数传进来的那个引用指向的是内存中的同一个对象,所以你通过这个副本也可以操作那个对象。但是如果你修改这个引用本身,比如让他指向内存中的另外一个对象,原来作为参数传进来的那个引用不会受到影响。
我觉得弄明白这些就行了,说值传递或引用传递都无所谓,但是说值传递更适合一些,这个值可以是引用也可以是基本数据类型。
铑枪--突廆孒 2008-09-20
  • 打赏
  • 举报
回复
你change类没有返回temp的值阿...,就相当于.我把卫星发射出去了,但是我并没有回收,这样的话,实验实的人去怎么可能拿到回收仓呢...
public class StringTest {
public StringTest() {
}
public static void main(String[] args) {
StringTest temp = new StringTest();
String a = new String("bbbbbbbbbbb");
a=temp.change(a);
System.out.println(a);
}
public String change(String temp){
temp = "aaaaaaaaaaaa";
return temp;
}
}
yoyo82 2008-09-20
  • 打赏
  • 举报
回复
你只改变了局部变量,

即使你return也没有用,主函数中没有接受这个返回值,同样只会输出bbb……
lizhanlang 2008-09-20
  • 打赏
  • 举报
回复
可以用类对象的引用来转递。。即可实现改变。


class op
{
public static void main(String[] agrs)
{
aa a=new aa();
a.w="bbbbb";
maa(a);
System.out.println(a.w);
}
static void maa(aa x)
{
x.w="aaaaa";
}
}
class aa
{
String w;
}
whlusha720 2008-09-20
  • 打赏
  • 举报
回复
加个return就OK了
goosman 2008-09-20
  • 打赏
  • 举报
回复
因为形式参数是一个新的变量。

public class Test {
String a="aaaa";
void chang(String temp) {
temp="bbbb";
}
public static void main(String[] args) {
change(a);
}
}

这段代码的执行过程是:
1. 加载类Test
2. 初始化成员变量a, a指向内存的dataStack的字符串"aaaa"
3. 进入main()方法
4. 调用change方法,把a的值传给temp.这时temp的值就是"aaaa"
5. 调用temp="bbbb"这一句,temp的值改变为"bbbb";
6. change(a)调用结束.
可以发现,a的值其实没有改变.
加载更多回复(8)

62,623

社区成员

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

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