这个String str为什么没变??

iPhone_XiaoC 2010-09-17 04:11:07
public class Example{
static String str=new String("good");
static char[] ch={'a','b','c'};
static byte a=120;
public void change(String str,char ch[]){
str="test Ok";
ch[0]='g';
}
public static void main(String[] args){
Example ex=new Example();
ex.change(str,ch);
System.out.print(Example.str+" and ");
System.out.print(Example.ch);

}

}
String传参传的是地址,为什么输出地不是test Ok 呢?费解中....
...全文
626 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
moqiang02 2013-01-02
  • 打赏
  • 举报
回复
感谢5楼,18楼和20楼三位兄弟的讲解,看了这三个基本就能明白了。
zhuyouyong 2010-09-17
  • 打赏
  • 举报
回复
ding[Quote=引用 3 楼 crazylaa 的回复:]
请去看String的源码。
java中的String狠特别,方法内部改变不了它的引用
[/Quote]
Aniao 2010-09-17
  • 打赏
  • 举报
回复
补充:所以你的做法只是把传进去的引用形参指向了另外一个地址,而没有影响到本来的引用。
Leguroky 2010-09-17
  • 打赏
  • 举报
回复
你改变的两个参量啊,不是实例变量,所以对象里的字符串没改变。
Aniao 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wangyq_412 的回复:]

很常见的问题,我来解释:
此问题设计Java的内存分配机制:
对于string类型:当调用change方法时,方法的参数会被当做方法的私有变量进行创建,这时内存机制是这样的,就是在栈中有两个不同的引用(全局变量str和方法内部的变量str)同时指向了堆中的一个对象,但是你在方法内部对对方法内部的私有变量进行重新赋值后,只是改变了方法内部变量的指向,对全局的str指向并没有影响。而方法结束后局……
[/Quote]


这是讲解得最好的。

Java里:

String s = "abc";
s = "111";

你以为s变成了“abc”?错!是s重新指向了“111”,“abc”和“111”都是在常量数据里的。

假如你还定义了一个String b = “111”,那么现在s和b都是指向的常量数据里的同一个地址
hefte 2010-09-17
  • 打赏
  • 举报
回复
java和C,C++还是有点区别的。
ytyjxhy 2010-09-17
  • 打赏
  • 举报
回复
String是final型,不能被改变值。
  • 打赏
  • 举报
回复
值传递,没有传地址;
ljx5857844 2010-09-17
  • 打赏
  • 举报
回复
学习学习
tmhk123 2010-09-17
  • 打赏
  • 举报
回复
只是改变了局部变量str 不信你用Eclipse debug一下,看看各个变量的值,绝对正确
coooliang 2010-09-17
  • 打赏
  • 举报
回复
java 中 String 很特别很特别

月经帖中说道:
String str = "test OK";创建一个对象,常量池中
String str = new String("test OK");创建两个对象 常量池,堆

当把引用传进方法中 这句:String str = "test OK";
String 引用了一个新的对象 这个对象在常量池中

kris_in_java 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xiaochun91103 的回复:]
很明显,在此处String传进去的是Str的一个副本,穿进去的是值。儿Char数组ch本身存放的就是char数组的首地址,所以传进去的是ch的首地址,必然会导致String结果不变,而Char数组的值发生改变。
[/Quote]

正解!~~
wypbt1032 2010-09-17
  • 打赏
  • 举报
回复
Java中参数传递的确用的是地址传递;
但是String比较特殊,一旦赋值内存里面的内容就不能改变了,
而且String是引用类型的;重新赋值后它指向的地址就改变了,
public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
}
ex.change(ex.str,ex.ch);
调用这个方法时,会将ex.str和ex.ch在内存中的地址传递给Str和ch[];他们本身指向的地址没变
执行 str="test ok"; 时,change中str指向的地址改变了,但ex.str指向的地址没变;
所以ex.str的值还是String str=new String("good");
ch[0]='g';会将ch[0]指向的地址的值改变,所以最终ex.change(ex.str,ex.ch);
改变了ch[]的值,但str的值仍然不变
keeya0416 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 iphone_xiaoc 的回复:]
谢谢大家,受益匪浅,我刚刚注册CSDN号,不知道如何给大家分啊?请教如何给分??
[/Quote]
点击上边的结贴
在结贴页面里选择 4 楼 (千万要选对哦)
在后边Text 里填 40 分就OK 了
WANGYQ_412 2010-09-17
  • 打赏
  • 举报
回复
很常见的问题,我来解释:
此问题设计Java的内存分配机制:
对于string类型:当调用change方法时,方法的参数会被当做方法的私有变量进行创建,这时内存机制是这样的,就是在栈中有两个不同的引用(全局变量str和方法内部的变量str)同时指向了堆中的一个对象,但是你在方法内部对对方法内部的私有变量进行重新赋值后,只是改变了方法内部变量的指向,对全局的str指向并没有影响。而方法结束后局部的str生命周期就会结束,而之后被垃圾回收。而你输出的是全局的str所以输出的不是“test Ok ”!不知道讲的清楚不?
iPhone_XiaoC 2010-09-17
  • 打赏
  • 举报
回复
谢谢大家,受益匪浅,我刚刚注册CSDN号,不知道如何给大家分啊?请教如何给分??
quhe0517 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 iphone_xiaoc 的回复:]
public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }
明白了,问题出在了参数名与类的属性名相同上了.不过,String是引用类型吧??,传的应该是地址吧??
[/Quote]
不是同名的问题,如果你非要用方法参数对象改变传入数据的局部变量或全局变量在java中是行不通的,java方法参数传递的是对象的值,不是地址,这个是个特殊的地方。
xiaochun91103 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 iphone_xiaoc 的回复:]
public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }
明白了,问题出在了参数名与类的属性名相同上了.不过,String是引用类型吧??,传的应该是地址吧??
[/Quote]

这是一个错误的认识,就算你把属性名改成和参数名不同结果还是一样的。
xiaochun91103 2010-09-17
  • 打赏
  • 举报
回复
很明显,在此处String传进去的是Str的一个副本,穿进去的是值。儿Char数组ch本身存放的就是char数组的首地址,所以传进去的是ch的首地址,必然会导致String结果不变,而Char数组的值发生改变。
iPhone_XiaoC 2010-09-17
  • 打赏
  • 举报
回复
public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }
明白了,问题出在了参数名与类的属性名相同上了.不过,String是引用类型吧??,传的应该是地址吧??
加载更多回复(12)

62,614

社区成员

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

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