黑马程序员技术交流社区
标题:
代码小问题请教一下
[打印本页]
作者:
Zhang_qian
时间:
2012-5-26 23:40
标题:
代码小问题请教一下
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吗?麻烦给讲解一下
作者:
袁培育
时间:
2012-5-27 00:07
这个问题以前有人问过,其实就是个参数传递的问题,为了便于说明,我们将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就会得到你想要的结果了
作者:
程旦
时间:
2012-5-27 00:12
楼主 这是老问题了 只能这样讲吧 在方法内你改变形参的引用指向是不会影响到实参的。。。比如你看
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的
不知楼主明白否
作者:
徐炯
时间:
2012-5-27 00:52
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"
}
}
作者:
黑马11期李项京
时间:
2012-5-27 09:05
定义在方法中的变量都是局部变量,定义方法外的变量才是全局变量,局部变量互不影响,各自存在于内存中,全局变量才能保持变量的唯一性。
第一种解决方法:
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);
}
}
作者:
路冬冬
时间:
2012-5-28 00:30
test(s1,s2);让 实参 和 形参 都指向了相同的变量,而字符串是不可以改变的,所以当在test方法中对 形参 s1和s2进行修改时, 形参 s1和s2就会指向其它的内存位置,而没有对 实参 的s1和s2进行任何的修改,所以打印的不会改变。
作者:
陌花╮有意、
时间:
2012-5-28 01:03
public static void test(String s1,String s2)
{
s1.replace('a','k');
s1 = s2;
}
此方法只是改变了形参s1和s2的值并不会影响到实参
作者:
whocases
时间:
2012-5-28 15:15
楼主童鞋,我很喜欢你这个问题。
各位在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
楼主 就像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);
}
}
结果
jkvk
true
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;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2