黑马程序员技术交流社区

标题: 程序运行结果 [打印本页]

作者: kong7906928    时间: 2014-6-16 23:33
标题: 程序运行结果
  1. public static void main(String[] args){
  2.                 String s1 = “abc”;
  3.                 String s2 = “xyz”;
  4. show(s1,s2);
  5. System.out.println(s1+”-----”+s2);
  6. }
  7. static void show(String s1,String s2){
  8.          s1 = s2+s1+”Q”;  
  9.     s2 = “W”+s1;   
  10. }
  11. 结果        abc-----xyz
复制代码
结果为什么是abc-----xyz不是xyzabcq-----Wxyzabc
String不是引用类型吗

作者: ╭月牙湾湾╮    时间: 2014-6-17 01:30
你要知道String具有一个特性,那就是不可变性。
String 类代表字符串,字符串常量,一旦创建了,就不能在修改了。
所以不论你的方法里边做什么操作,s1和s2的值是不会变的。
作者: 过犹不及    时间: 2014-6-17 07:25
看了你的题,倒提醒了我一下,我也得再把值传递和引用传递好好再看一下。
作者: 过犹不及    时间: 2014-6-17 07:39
这里面讲的很详细,你看一下http://www.csdn123.com/html/itweb/20131113/219554.htm
作者: 喜爱    时间: 2014-6-17 09:03
好像局部变量和引用变量有差异的!
作者: ‍杨博    时间: 2014-6-17 09:13
1.首先String类型的final类型的,一旦创建,不会改变,改变的只是引用。
2,方法中的传递的参数只是一个临时变量,在方法体内对Stirng做的任何操作都是引用的改变,而方法一旦结束,方法体内的引用变量出栈,所以对堆内存中的String无影响。
作者: 闪耀.Q    时间: 2014-6-17 11:56
来学习了
作者: 唐坚    时间: 2014-6-17 12:48
字符串最大的特定:一旦被初始化就不可以改变。是一个常量。

作者: 焦国军    时间: 2014-6-17 15:29
你定义的s1和s2 都是局部的,再说show是void不是String
作者: 马宁    时间: 2014-6-17 15:39
来打酱油看看来了 !
作者: 苏周周    时间: 2014-6-17 19:07
s1和s2变量都是在栈内存中,赋值时都是引用地址,当方法结束了,s1和s2指的地址值还是"abc"和“xyz”;

作者: Ice丶wj    时间: 2014-6-17 20:01
返回值类型是void
作者: 沐阳6011    时间: 2014-6-17 20:13
在show方法中的s1,s2变量是局部变量,调用方法时存在于栈内存中,当方法执行结束后,这里的s1,s2变会出栈,所以你后面的打印语句,打印的是主函数中定义的s1,s2。也就是“abc”"xyz"。主要问题是出在这里。
我把代码改成这样,结果就会是你想要的哦。注释部分是我在验证另外一个问题,不用管。
  1. class TestS
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.          String s1 = "abc";
  6.          String s2 = "xyz";
  7.                 // String s3=s2+s1+'q';
  8.                  //System.out.println(s3);
  9.              show(s1,s2);
  10.                  //System.out.println(s1+"-----"+s2);
  11.         }
  12.         static void show(String s1,String s2)
  13.         {    s1 = s2+s1+"Q";  
  14.                  s2 = "W"+s1;  
  15.                  System.out.println(s1+"-----"+s2);
  16.     }       
  17. }
复制代码


作者: 小熊星座    时间: 2014-6-17 20:13
来学习一下
作者: 任黎明    时间: 2014-6-17 21:39
遇到同样问题,来学习了

作者: gyw520gyw    时间: 2014-6-17 21:40
show方法的s1 s2和主函数的s1 s2都是局部变量,作用域只在各自的大括号内,你想要的结果

public static void main(String[] args){
        String s1 = "abc";
        String s2 = "xyz";
        show(s1,s2);
        //System.out.println(s1+"-----"+s2);
}
        static void show(String s1,String s2){
                s1 = s2+s1+"Q";       
                s2 = "W"+s1;   
                System.out.println(s1+"-----"+s2);
               
        }

作者: 北极£莜蓝    时间: 2014-6-17 21:43
有图有真像
作者: 北极£莜蓝    时间: 2014-6-17 22:06
中间有些步骤省略了,示意的.不懂的在问.String是常量.一旦被赋值就不能改变,存储的位置是方法区中的常量池

String.png (106.58 KB, 下载次数: 8)

String.png

作者: 塔罗    时间: 2014-6-17 22:18
你可以试试在那个show方法中,输入s1,s2看看什么结果。一楼说的很好




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2