java值类型与引用类型问题

YuFS 2014-05-26 10:45:32
代码:
public static void main(String[] args) {
String str="a";
StringBuffer sb=new StringBuffer("a");
process(str);
System.out.println(str);
process(sb);
System.out.println(sb);
process(str,sb);
System.out.println(str);
System.out.println(sb);
//结果 a a a aA
}
public static void process(String str) {
str = "A";
}
public static void process(StringBuffer sb) {
sb = new StringBuffer();
sb.append("A");
}
public static void process(String str, StringBuffer sb) {
str = new String("A");
sb.append("A");
}

问题:String,StringBuffer不都是引用类型吗,为什么代码运行的结果是a a a aA(没有变化)?
...全文
212 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
俊子JY 2014-05-28
  • 打赏
  • 举报
回复
引用 6 楼 yfs2468 的回复:
[quote=引用 2 楼 u010729348 的回复:] 方法中的参数时局部变量来的,拿最后一个来说吧,方法public static void process(String str, StringBuffer sb) 中参数str和sb都是局部变量,调用process(str,sb),是让局部变量跟传入的参数指向同一个对象,str = new String("A");只是将局部变量str指向另一个对象引用,跟外部的str没有关系,所以str仍为a,而sb.append("A");是将局部变量sb指向的对象追加"A",而由于局部变量指向的对象跟外部的sb指向同一个对象,所以外部的sb也就变成aA了。
那第一个 String str="a"; public static void process(String str) { str = "A"; } 这个是str怎么还是“a”?[/quote]
引用 6 楼 yfs2468 的回复:
[quote=引用 2 楼 u010729348 的回复:] 方法中的参数时局部变量来的,拿最后一个来说吧,方法public static void process(String str, StringBuffer sb) 中参数str和sb都是局部变量,调用process(str,sb),是让局部变量跟传入的参数指向同一个对象,str = new String("A");只是将局部变量str指向另一个对象引用,跟外部的str没有关系,所以str仍为a,而sb.append("A");是将局部变量sb指向的对象追加"A",而由于局部变量指向的对象跟外部的sb指向同一个对象,所以外部的sb也就变成aA了。
那第一个 String str="a"; public static void process(String str) { str = "A"; } 这个是str怎么还是“a”?[/quote]也一样啊,只是让局部变量str指向两一个对象,那个对象的值为“A",跟外部的str没关系的。而最后一个的sb会变成aA是因为在局部变量指向的对象上改(追加"A"),而局部变量和外部的sb又指向同个对象,所以也变了。
YuFS 2014-05-27
  • 打赏
  • 举报
回复
引用 1 楼 vnvlyp 的回复:
如果你认为引用类型在函数内修改值就一定能反映到外部,那只能说明你还没真正理解引用 第一个process,局部变量赋值,这只改变了局部变量的指向,并不能改变原来指向的String的内容 第二个process,同样的问题,给局部变量赋值,sb = new StringBuffer();以后sb就不是外部那个StringBuffer了,所以随便你怎么修改也不会反映到外部 第三个process,str = new String("A");和前面两个是一样的问题,而sb.append("A");是有效的,所以你看到最后输出了aA
能帮我讲解下,public static void process(String str) { str = a+"A"; }为什么引用类型的String被改变了值,str却不变
iDeputy 2014-05-27
  • 打赏
  • 举报
回复
学习了
YuFS 2014-05-27
  • 打赏
  • 举报
回复
引用 2 楼 u010729348 的回复:
方法中的参数时局部变量来的,拿最后一个来说吧,方法public static void process(String str, StringBuffer sb) 中参数str和sb都是局部变量,调用process(str,sb),是让局部变量跟传入的参数指向同一个对象,str = new String("A");只是将局部变量str指向另一个对象引用,跟外部的str没有关系,所以str仍为a,而sb.append("A");是将局部变量sb指向的对象追加"A",而由于局部变量指向的对象跟外部的sb指向同一个对象,所以外部的sb也就变成aA了。
那第一个 String str="a"; public static void process(String str) { str = "A"; } 这个是str怎么还是“a”?
wu244534279 2014-05-26
  • 打赏
  • 举报
回复
早知道前3楼画了个图,咱就不发表了,睡觉!
wu244534279 2014-05-26
  • 打赏
  • 举报
回复
关于这个方法 1、StringBuffer sb=new StringBuffer("a"); 2、process(sb); 3、public static void process(StringBuffer sb) { 4、sb = new StringBuffer(); 5、sb.append("A"); } 我举个例子吧。 一:第1行,创建一个实例,假设此时sb变量的值为0x000001 二:然后执行到第3行,又来了个sb,注意这和前面的sb不是同一个东西,只是大家的值都为0x000001而已,现在假设后面的sb为sb(1)咯,注意了,方法process里面的sb全是sb(1) 三:执行到第四行,sb1的地址突然改变了,假设变为0x000002了 四:执行到第五行,这里当然是地址0x000002的对象改变啦 五,方法执行完毕,结果0x000001地址的对象并没有改变,所以前一个sb指向的对象并没有改变!
vnvlyp 2014-05-26
  • 打赏
  • 举报
回复
画个图形象一点,以第二个process过程为例,首先sb指向一个StringBuffer对象

然后调用process(sb),因为Java只有按值传递参数(为了区分这里将参数名改为sb2),所以sb的值传给sb2,也就是现在sb2也指向那个StringBuffer对象

然后你sb2 = new StringBuffer(),实际上就是新创建一个StringBuffer对象,然后让sb2指向他,所以在这之后无论你怎么修改,也是修改新创建的StringBuffer对象,和原来的对象没有一丝关系
俊子JY 2014-05-26
  • 打赏
  • 举报
回复
方法中的参数时局部变量来的,拿最后一个来说吧,方法public static void process(String str, StringBuffer sb) 中参数str和sb都是局部变量,调用process(str,sb),是让局部变量跟传入的参数指向同一个对象,str = new String("A");只是将局部变量str指向另一个对象引用,跟外部的str没有关系,所以str仍为a,而sb.append("A");是将局部变量sb指向的对象追加"A",而由于局部变量指向的对象跟外部的sb指向同一个对象,所以外部的sb也就变成aA了。
vnvlyp 2014-05-26
  • 打赏
  • 举报
回复
如果你认为引用类型在函数内修改值就一定能反映到外部,那只能说明你还没真正理解引用 第一个process,局部变量赋值,这只改变了局部变量的指向,并不能改变原来指向的String的内容 第二个process,同样的问题,给局部变量赋值,sb = new StringBuffer();以后sb就不是外部那个StringBuffer了,所以随便你怎么修改也不会反映到外部 第三个process,str = new String("A");和前面两个是一样的问题,而sb.append("A");是有效的,所以你看到最后输出了aA

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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