java String问题

move22 2015-06-10 04:21:58
class StringTest1{
public static void main(String[] args){
String s1="java";
String s2="hello";

method_1(s1,s2);
System.out.println("s1="+s1+"........."+"s2="+s2);
}

public static void method_1(String s1,String s2)
{
s1.replace("a","k");
s1 = s2;
}
}
结果:s1=java......s2=hello
问:为什么结果不是s1=java........s2=java
...全文
188 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2015-06-11
  • 打赏
  • 举报
回复
你调用的s1.replace("a","k")这个方法并不能改变s1所对应的实际对象,因为String类型对象是不能改变的。
move22 2015-06-10
  • 打赏
  • 举报
回复
已找到答案: java中形参是实参的副本,仅在方法被调用时才会分配内存单元,方法体结束,内存单元即被回收,改变形参的值是无法影响实参的值的。作为引用被传递的实际上是引用的地址,一般误区就在这里,貌似传递了地址就是地址传递,但别忘了,这建立在2个不同地址的变量的基础上 非基本类型的确是引用,但是传递这些非基本类型时虽然传递了地址,但地址值是赋给这些参数变量的,很简单的一个问题就可以证明:你是否能通过在方法体内为传入的引用赋值来改变方法体外的这个引用?显然是不能得,因为他们根本就是2个引用引用了同一个地址,也就是将同一个值赋值给了2个变量,虽然这两个变量都是引用,但他们却是2个不同的变量,根本谈不上引用的传递。
move22 2015-06-10
  • 打赏
  • 举报
回复
引用 2 楼 fengyu_caihong 的回复:
你传过去两个参数,操作的又不是参数本身,传过去的参数相当于又创建了两个string跟原来的没什么关系,如果你给方法内输出你就会发现给你想的输出类似了~
传过去的不是string的地址引用么?s1=s2中s1不是重新指向hello了么?
move22 2015-06-10
  • 打赏
  • 举报
回复
引用 8 楼 qq_28163175 的回复:
string并不是引用传递,所以你对形参修改是不影响实参的
java中,string是一个特殊对象,而java中所有对象都是引用传递
自傷無色丶 2015-06-10
  • 打赏
  • 举报
回复
string并不是引用传递,所以你对形参修改是不影响实参的
qq_26092115 2015-06-10
  • 打赏
  • 举报
回复
public static void main(String[] args){ String s1="java"; String s2="hello"; String []s=method_1(s1,s2); System.out.println("s1="+s[0]+"........."+"s2="+s[1]); } public static String[] method_1(String s1,String s2) { s1.replace("a","k"); s1 = s2; String []s={s1,s2}; return s; }
SUN丶XT 2015-06-10
  • 打赏
  • 举报
回复
引用 4 楼 move22 的回复:
[quote=引用 1 楼 u010737972 的回复:] s1.replace("a","k"); 这里参数的两个双引号去掉s1.replace(a,k);
这里我确定没有错......[/quote] 恩恩,刚刚脑子抽了。。。给了个无厘头的答案。
move22 2015-06-10
  • 打赏
  • 举报
回复
引用 2 楼 fengyu_caihong 的回复:
你传过去两个参数,操作的又不是参数本身,传过去的参数相当于又创建了两个string跟原来的没什么关系,如果你给方法内输出你就会发现给你想的输出类似了~
修改为这样呢? StringBuilder ss1= new StringBuilder("java"); StringBuilder ss2= new StringBuilder("hello"); method_2(ss1,ss2); System.out.println("s1="+s1+"........."+"s2="+s2); public static void method_2(StringBuilder s1, StringBuilder s2) { s1.append(s2); s1=s2; }
move22 2015-06-10
  • 打赏
  • 举报
回复
引用 1 楼 u010737972 的回复:
s1.replace("a","k"); 这里参数的两个双引号去掉s1.replace(a,k);
这里我确定没有错......
SUN丶XT 2015-06-10
  • 打赏
  • 举报
回复
引用 1 楼 u010737972 的回复:
s1.replace("a","k"); 这里参数的两个双引号去掉s1.replace(a,k);
sorry,刚刚看错了。忽视我的错误答案。
fengyu_caihong 2015-06-10
  • 打赏
  • 举报
回复
你传过去两个参数,操作的又不是参数本身,传过去的参数相当于又创建了两个string跟原来的没什么关系,如果你给方法内输出你就会发现给你想的输出类似了~
SUN丶XT 2015-06-10
  • 打赏
  • 举报
回复
s1.replace("a","k"); 这里参数的两个双引号去掉s1.replace(a,k);

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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