java代码,说说输出结果,和原因,刚学java ,有点不是很理解。

ayideai 2013-04-09 12:18:50
class Test{

public static void main(String[] args) {
String s1 = new String("java");
String s2 = new String("hello");
method_1(s1,s2);
System.out.println(s1+"...."+s2); //java....hello

StringBuilder s11 = new StringBuilder("java");
StringBuilder s22 = new StringBuilder("hello");
method_2(s11,s22);
System.out.println(s11+"-----"+s22);
}
public static void method_1(String s1,String s2){
s1=s1.replace('a','k');

s1 = s2;

}
public static void method_2(StringBuilder s1,StringBuilder s2){
s1.append(s2);

s1 = s2;

}
}
...全文
554 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
JunZiLianJH 2013-04-10
  • 打赏
  • 举报
回复
String和StringBuilde的区别,String 定义的变量是不可变的,StringBuilde是可以进行操作的
ayideai 2013-04-10
  • 打赏
  • 举报
回复
引用 35 楼 xsd219222 的回复:
引用 27 楼 ayideai 的回复: 引用 19 楼 xsd219222 的回复:“九个正方形”锅锅的是正解,三楼是不对滴,我给你分析下: 代码改成: class Test{ public static void main(String[] args) { String s1 = new String("java"); String s2 = new String("hel……
谢谢,我已经弄懂了。和String有关系。
Cute_Tiger 2013-04-10
  • 打赏
  • 举报
回复
引用 27 楼 ayideai 的回复:
引用 19 楼 xsd219222 的回复:“九个正方形”锅锅的是正解,三楼是不对滴,我给你分析下:
代码改成:
class Test{

public static void main(String[] args) {
String s1 = new String("java");
String s2 = new String("hello");
me……

不支持大图浏览么,我勒个去。
Cute_Tiger 2013-04-10
  • 打赏
  • 举报
回复
引用 27 楼 ayideai 的回复:
引用 19 楼 xsd219222 的回复:“九个正方形”锅锅的是正解,三楼是不对滴,我给你分析下:
代码改成:
class Test{

public static void main(String[] args) {
String s1 = new String("java");
String s2 = new String("hello");
me……


Cute_Tiger 2013-04-10
  • 打赏
  • 举报
回复
引用 26 楼 beefcattlexiaoyang 的回复:
坐等高手说明。 个人认为 引用 19 楼 xsd219222 的回复:“九个正方形”锅锅的是正解,三楼是不对滴,我给你分析下: 这个说法比较靠谱一点。 但是没有说完全。 比如 s1.append(s2);得到了javahello。 那s1 = s2 这个为什么后面没有变成hello。
s1 = s2 这个和s1.append(s2)不一样,s1 = s2;是引用传递,方法执行完,效果就没了。我在图中有画的。
Last_Dodo 2013-04-10
  • 打赏
  • 举报
回复
String是mutable类型,做为参数传入方法时是传值,所以第一个方法不改进传进去的String。 StringBuilder不是mutable类型,所以做为参数传入方法时是传引用(java的引用概念和C++不太一样),所以第二个方法会改变传入的值
naerxun 2013-04-09
  • 打赏
  • 举报
回复
字符串类型和int等基本类型是有差别的
livend 2013-04-09
  • 打赏
  • 举报
回复
我也不懂!
Bettygonna 2013-04-09
  • 打赏
  • 举报
回复
java....hello javahello-----hello String类的对象不可以对内容进行动态的操作,比如删减增加字符 method——1中s1 = S2 只是对地质进行了赋值而没有对字符串内容进行改变所以不能改变内容 而StringBuilder是一个可变的字符序列类 ,和StringBuffer都是对字符串进行动态操作的类所以可以改变内容
薛123 2013-04-09
  • 打赏
  • 举报
回复
mark2060 2013-04-09
  • 打赏
  • 举报
回复
引用 6 楼 zzt369880281 的回复:
方法1中,接收了两个引用,这个引用指向了一个对象,拿s1举例,我们假设这个对象的地址是0001,s1被重新赋值过,(也就是=过)这时,s1就指向了新地址0002,可是0001里面还是原来的对象。 然后方法执行完了之后,方法内的s1没了,可是外面的s1还是指向的0001。而0001里面还是原来的字符串。 方法2中,接收的也是两个引用,拿s1举例,s1.append(……
那方法一中, s1=s1.replace('a','k'); 这个操作怎么没有效果?
zzt369880281 2013-04-09
  • 打赏
  • 举报
回复
方法1中,接收了两个引用,这个引用指向了一个对象,拿s1举例,我们假设这个对象的地址是0001,s1被重新赋值过,(也就是=过)这时,s1就指向了新地址0002,可是0001里面还是原来的对象。 然后方法执行完了之后,方法内的s1没了,可是外面的s1还是指向的0001。而0001里面还是原来的字符串。 方法2中,接收的也是两个引用,拿s1举例,s1.append(s2);会直接对0001这个地址进行操作,这样的话0001里面的字符串就变了,第二行s1=s2,这个局部的s1的引用就指向了s2的引用,比如是0003,然后方法返回,局部的s1和s2都销毁了,方法外输出的时候,0001里的对象已经变了
rumlee 2013-04-09
  • 打赏
  • 举报
回复
字打错了,应该是"但是s1 = s2;并不会改变s1和s2,"
rumlee 2013-04-09
  • 打赏
  • 举报
回复
引用 3 楼 zzt369880281 的回复:
引用 2 楼 rumlee 的回复:method1调用后无变化,method2调用后有变化。 字符串类型在java里是一种特殊类型,类似于int等基本类型。method1传的是值,method2传的是引用。严重错误,怎么能误导人家初学者
我怎么误导了,应该不会啊,我虽没用运行,但是觉得理论上应该是的啊。 method1调用后,应该不变,这个应该没有异议。 method2调用后,s1.append(s2);这一句肯定会改变s1的值,但是s1 = s2;并不会改变s2,所以打印出来应该是java hello hello,hello会被重复一次。 我想应该是这样。
zzt369880281 2013-04-09
  • 打赏
  • 举报
回复
引用 2 楼 rumlee 的回复:
method1调用后无变化,method2调用后有变化。 字符串类型在java里是一种特殊类型,类似于int等基本类型。method1传的是值,method2传的是引用。
严重错误,怎么能误导人家初学者
rumlee 2013-04-09
  • 打赏
  • 举报
回复
method1调用后无变化,method2调用后有变化。 字符串类型在java里是一种特殊类型,类似于int等基本类型。method1传的是值,method2传的是引用。
u010230795 2013-04-09
  • 打赏
  • 举报
回复
因为String是字符串类型,指向的引用相当于常量,不能被改变吧,,,有问题希望高手帮忙指点!
u010230795 2013-04-09
  • 打赏
  • 举报
回复
我运行了,method_1没有改变,method_2改变了
ayideai 2013-04-09
  • 打赏
  • 举报
回复
引用 19 楼 xsd219222 的回复:
“九个正方形”锅锅的是正解,三楼是不对滴,我给你分析下:
代码改成: class Test{ public static void main(String[] args) { String s1 = new String("java"); String s2 = new String("hello"); method_1(s1,s2); System.out.println(s1+"...."+s2); //java....hello StringBuilder s11 = new StringBuilder("java"); StringBuilder s22 = new StringBuilder("hello"); method_2(s11,s22); System.out.println(s11+"-----"+s22); } public static void method_1(String s1,String s2){ s1.replace('a','k'); s1 = s2; } public static void method_2(StringBuilder s1,StringBuilder s2){ s1.append(s2); s1 = s2; } } 结果是一样的, 而且s1.replace('a','k')指向的是同一个内存区,只是replace()方法没有改变结果。越来越糊涂了,请解答一下,谢谢!
大_爱 2013-04-09
  • 打赏
  • 举报
回复
坐等高手说明。 个人认为
引用 19 楼 xsd219222 的回复:
“九个正方形”锅锅的是正解,三楼是不对滴,我给你分析下:
这个说法比较靠谱一点。 但是没有说完全。 比如 s1.append(s2);得到了javahello。 那s1 = s2 这个为什么后面没有变成hello。
加载更多回复(17)

62,615

社区成员

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

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