A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class  Test{
  2.         public static void main(String[] args) {
  3.                 String s1 = "java";
  4.                 String s2 = "hello";
  5.                 method_1(s1,s2);
  6.                 System.out.println(s1+"...."+s2); //java....hello
  7.                
  8.                 StringBuilder s11 = new StringBuilder("java");
  9.                 StringBuilder s22 = new StringBuilder("hello");
  10.                 method_2(s11,s22);
  11.                 System.out.println(s11+"-----"+s22); //javahello-----hello
  12.         }
  13.         public static void method_1(String s1,String s2){
  14.                 s1.replace('a','k');//将出现一个新的字符串,s1并没有变
  15.                 s1 = s2;//?????为什么赋值没成功??????
  16.         }
  17.         public static void method_2(StringBuilder s1,StringBuilder s2){
  18.                 s1.append(s2);
  19.                 s1 = s2;//?????为什么赋值没成功?????????
  20.         }
  21. }
复制代码

5 个回复

倒序浏览
为什么两个方法区中的s1=s2没有执行?
回复 使用道具 举报
程序执行了....
你的两个method方法传进来的是对象的地址变量名,方法里操作的是方法自己创建的引用对象地址变量名,内外对象开始时的指向地址是一样的,但你后来做了改变,那你能改的只是方法里自己创建的对象指向的地址变了,外面的对象指向地址并没有改变。你在方法里再添加打印语句就可以看到结果了

回复 使用道具 举报
不是没有执行
你在method里面打印s1和s2就知道执行了
关键是你的method方法中的s1和s2没有对main方法里面的s1和s2产生影响 所以出现了这种问题
解决方法就是你把 System.out.println(s1+"...."+s2); //java....hello
这句话放到method里面 或者将method返回值设定为s1 这样就行了
回复 使用道具 举报
因为你method_2是改变了参数的地址, 这个函数没有返回值, 返回的还是原有参数,也就是原有地址,所以是在函数内部赋值成功了,但是在返回的时候,仍然是返回原有的引用
回复 使用道具 举报
第一个传了两个引用类型的地址值给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指向对象值不变。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马