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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Zhang_qian 中级黑马   /  2012-5-26 23:40  /  2336 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class StringTest
{
        public static void main(String[] args)
        {
                String s1 = "java";
                String s2 = "hehe";
                test(s1,s2);
                System.out.println(s1+"....."+s2);
        }

        public static void test(String s1,String s2)
        {
                s1.replace('a','k');
                s1 = s2;
        }
}//输出结果为什么还是s1的值没改变啊?它不是调用了test方法吗?不是已经把s2的值重新赋给了s1吗?麻烦给讲解一下

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

8 个回复

倒序浏览
这个问题以前有人问过,其实就是个参数传递的问题,为了便于说明,我们将test方法里的s1和s2换为s3,s4这样并不影响结果还便于理解。你在调用test方法时把s1,s2的地址值传给了s3,s4,这样s3和s4就分别指向了“java”“hehe”然后s3调用replace方法把a换成了k,即“java”变为“jkjk”,接着执行s3=s4的赋值语句,只是将s4所指对象“hehe”的地址值赋给了s3,而s1的地址值还是指向“jkjk”(注意这时java已经变为jkjk),所以你输出时就得到了你看到的结果,你如果在test里直接输出s1,s2就会得到你想要的结果了

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
楼主 这是老问题了 只能这样讲吧  在方法内你改变形参的引用指向是不会影响到实参的。。。比如你看
void changeInt(int i){
i=2;
}

void changeString(String str){
str=new String("b");
}

那么OK 现在有两个变量   int i=0; String s=new String("a");
来调用这两个方法 changeInt(i)  changeString(s)之后  你在打印 i 和 s 的值  你会发现都没有改变   

这种情况和你的题目一样  s1 = s2; 这句话是不能影响到实参s1的     

不知楼主明白否

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
2楼正解!补充下:
class StringTest
{
        public static void main(String[] args)
        {
                String s1 = "java";
                String s2 = "hehe";
                test(s1,s2);
                System.out.println(s1+"....."+s2);//s1是"jkvk",s2是“hehe”
        }

        public static void test(String s1,String s2)
        {
                s1.replace('a','k');//s1变成了jkvk
                s1 = s2;//赋值操作,只是把s2的地址值赋给了s1,这时s1和s2都指向了"hehe", 但只在test方法里有效
                System.out.println(s1+"....."+s2);//s1和s2都是"hehe"
        }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
定义在方法中的变量都是局部变量,定义方法外的变量才是全局变量,局部变量互不影响,各自存在于内存中,全局变量才能保持变量的唯一性。
第一种解决方法:
class Test
{
        public static String s1 = null;
        public static String s2 = null;
        public static void main(String[] args)
        {
                s1 = "java";
                s2 = "hehe";
                test(s1,s2);
                System.out.println(s1+"....."+s2);
        }

        public static void test(String s11,String s12)//这里重新定义String对象,所以我把变量名改为s11、s12
        {
                s1 = s11.replace('a','k');//再把s11、s12赋给s1
                s1 = s12;
        }
}
第二种解决方法


class Test
{
        public static void main(String[] args)
        {
                String s1 = "java";
                String s2 = "hehe";
                System.out.println(test(s1,s2));
               
        }

        public static String test(String s1,String s2)
        {
                s1.replace('a','k');
                s1 = s2;
                return (s1+"....."+s2);
        }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 赞一个!

查看全部评分

回复 使用道具 举报
test(s1,s2);让  实参  和  形参  都指向了相同的变量,而字符串是不可以改变的,所以当在test方法中对  形参  s1和s2进行修改时,  形参  s1和s2就会指向其它的内存位置,而没有对  实参  的s1和s2进行任何的修改,所以打印的不会改变。
回复 使用道具 举报
public static void test(String s1,String s2)
         {
                 s1.replace('a','k');
                 s1 = s2;
         }
此方法只是改变了形参s1和s2的值并不会影响到实参
回复 使用道具 举报
whocases 黑马帝 2012-5-28 15:15:26
8#
楼主童鞋,我很喜欢你这个问题。
各位在myeclipse中是否执行过这段代码呢?我是执行了。结果如下:
java.....hehe
不是jkjk....hehe
如下:
  public static void test(String s1,String s2)
        {
                s1.replace('a','k');    //字符串是不可变的特性。如果对 s1.replace('a','k');    会产生一个新的对象--- jkjk,但遗憾的是这个对象没有任何引用,它夭折了。s1的值没有变,此时打印s1的话,还是java。
                s1 = s2;   //s1的值改变,与s2一样指向了:hehe
        }
就是指向来回的变化。
回复 使用道具 举报
张頔 中级黑马 2012-5-28 15:44:04
9#
楼主 就像8楼说的那样在test方法中 你的s1.replace("a","k")及时替换了 你也没有的的到他  更改代码如下
public class  string
{
        public static void main(String[] args)
        {
                String s1 = "java";
                String s2 = "hehe";
                test(s1,s2);
                System.out.println(s1+"....."+s2);
        }

        public static void test(String s3,String s4)
        {               
                String s1=s3.replaceAll("a", "k");                System.out.println(s1);                s3 = s4;
                System.out.println(s3==s4);
                System.out.println(s3);
        }
}

结果
jkvktrue
hehe
java.....hehe


而如果你想将最后的  想的到jkvk.....hehe的话 可以把test()方法变为有返回值的  代码如下
public class  string
{
        public static void main(String[] args)
        {
                String s1 = "java";
                String s2 = "hehe";
                String s = test(s1);
                System.out.println(s+"....."+s2);
        }

        public static String test(String s3)
        {               
                        String s1=s3.replaceAll("a", "k");
                        return s1;
        }
}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马