黑马程序员技术交流社区
标题:
关于String和StringBuilder的一个程序的疑问
[打印本页]
作者:
乔栋
时间:
2015-7-2 11:40
标题:
关于String和StringBuilder的一个程序的疑问
class Test{
public static void main(String[] args) {
String s1 = "java";
String s2 = "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); //javahello-----hello
}
public static void method_1(String s1,String s2){
s1.replace('a','k');//将出现一个新的字符串,s1并没有变
s1 = s2;//?????为什么赋值没成功??????
}
public static void method_2(StringBuilder s1,StringBuilder s2){
s1.append(s2);
s1 = s2;//?????为什么赋值没成功?????????
}
}
复制代码
作者:
乔栋
时间:
2015-7-2 11:41
为什么两个方法区中的s1=s2没有执行?
作者:
懒锋2015
时间:
2015-7-2 12:14
程序执行了....
你的两个method方法传进来的是对象的地址变量名,方法里操作的是方法自己创建的引用对象地址变量名,内外对象开始时的指向地址是一样的,但你后来做了改变,那你能改的只是方法里自己创建的对象指向的地址变了,外面的对象指向地址并没有改变。你在方法里再添加打印语句就可以看到结果了
作者:
慕容旺财
时间:
2015-7-2 17:55
不是没有执行
你在method里面打印s1和s2就知道执行了
关键是你的method方法中的s1和s2没有对main方法里面的s1和s2产生影响 所以出现了这种问题
解决方法就是你把 System.out.println(s1+"...."+s2); //java....hello
这句话放到method里面 或者将method返回值设定为s1 这样就行了
作者:
zhjunwenyy
时间:
2015-7-2 18:06
因为你method_2是改变了参数的地址, 这个函数没有返回值, 返回的还是原有参数,也就是原有地址,所以是在函数内部赋值成功了,但是在返回的时候,仍然是返回原有的引用
作者:
几率收割
时间:
2015-7-2 18:23
第一个传了两个引用类型的地址值给method调用method后引用类型对象发生了改变,但由于String类型是特殊的引用类型值不会发生改变,也就说是s1地址值找到了java但是java是String类型不能改变,所以常量池重新按要求组合了一个jkjk把其地址值赋给了s1,又由于s1是局部变量,出了method被释放。主函数打印时只能找到开始定义的s1所以打印java(s2同理)。
第二个s11,s22是地址值定义在栈中,其指向的对象定义在堆中。调用method2把按要求将s22指向的对象加入了s11指向的对象后面,然后将s22的地址值赋给了s11,出了method2方法s11,s22局部变量被释放,所以主函数s11
地址值不变,但指向的对象值该变了。s22指向对象值不变。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2