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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kong7906928 中级黑马   /  2014-6-16 23:33  /  2863 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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不是引用类型吗

18 个回复

倒序浏览
你要知道String具有一个特性,那就是不可变性。
String 类代表字符串,字符串常量,一旦创建了,就不能在修改了。
所以不论你的方法里边做什么操作,s1和s2的值是不会变的。
回复 使用道具 举报
看了你的题,倒提醒了我一下,我也得再把值传递和引用传递好好再看一下。
回复 使用道具 举报
这里面讲的很详细,你看一下http://www.csdn123.com/html/itweb/20131113/219554.htm
回复 使用道具 举报
好像局部变量和引用变量有差异的!
回复 使用道具 举报
1.首先String类型的final类型的,一旦创建,不会改变,改变的只是引用。
2,方法中的传递的参数只是一个临时变量,在方法体内对Stirng做的任何操作都是引用的改变,而方法一旦结束,方法体内的引用变量出栈,所以对堆内存中的String无影响。
回复 使用道具 举报
来学习了
回复 使用道具 举报
唐坚 中级黑马 2014-6-17 12:48:02
8#
字符串最大的特定:一旦被初始化就不可以改变。是一个常量。
回复 使用道具 举报
你定义的s1和s2 都是局部的,再说show是void不是String
回复 使用道具 举报
来打酱油看看来了 !
回复 使用道具 举报
s1和s2变量都是在栈内存中,赋值时都是引用地址,当方法结束了,s1和s2指的地址值还是"abc"和“xyz”;
回复 使用道具 举报
返回值类型是void
回复 使用道具 举报
在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. }
复制代码

回复 使用道具 举报
来学习一下
回复 使用道具 举报
遇到同样问题,来学习了
回复 使用道具 举报
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);
               
        }
回复 使用道具 举报
有图有真像
回复 使用道具 举报
中间有些步骤省略了,示意的.不懂的在问.String是常量.一旦被赋值就不能改变,存储的位置是方法区中的常量池

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

String.png
回复 使用道具 举报
你可以试试在那个show方法中,输入s1,s2看看什么结果。一楼说的很好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马