黑马程序员技术交流社区
标题:
String问题
[打印本页]
作者:
仲伟
时间:
2013-5-12 20:52
标题:
String问题
本帖最后由 仲伟 于 2013-5-12 23:23 编辑
public class MyClass {
static void aMethod(StringBuffer sf1, StringBuffer sf2) {
sf1.append(sf2); sf2 = sf1;
}
public static void main(String[] args){
StringBuffer sf1 = new StringBuffer("A");
StringBuffer sf2 = new StringBuffer("B");
aMethod(sf1,sf2);
System.out .println(sf1+ "":"+sf2);
} }
为什么输出结果是:AB:B
我感觉应该是 AB:AB
作者:
张迁
时间:
2013-5-12 21:07
这样改写后sf1输出结果是AB,这是局部变量与成员变量的区别
public class MyClass {
static void aMethod(StringBuffer sf1, StringBuffer sf2) {
sf1.append(sf2);
sf2 = sf1;
System.out.println(sf1);
System.out.println(sf2);
}
public static void main(String[] args){
StringBuffer sf1 = new StringBuffer("A");
StringBuffer sf2 = new StringBuffer("B");
aMethod(sf1,sf2);
System.out .println(sf1+ ":"+sf2);
}
}
复制代码
作者:
赵利斌
时间:
2013-5-12 21:23
不是说局部变量和成员变量
这个是这么回事 str1.append(str2)方法是将两个字符串连接之后返回给str1这个字符创,所以 sf1.append(sf2); 这个方法调用之后 sf1="AB"; 单sf2还是原来的值
所以结果是AB:B
作者:
任江峰
时间:
2013-5-12 21:37
本帖最后由 任江峰 于 2013-5-12 21:41 编辑
aMethod(sf1,sf2); 传递参数的时候是传递引用,把main函数里的实际参数sf1,sf2引用的地址,复制给aMethod()方法里的形式参数sf1,sf2。
sf1.append(sf2); 操作了形式参数sf1引用的对象,操作完后对象的值变成了AB.此时main函数里实参sf1的引用也指向这个对象,所以输出的值是"AB"
sf2 = sf1; 操作了形式参数sf2引用的指向,使它指向sf1引用的对象。而此时main函数里的实参sf2的引用没有改变,还是指向原来的对象。值为"B".
作者:
张金铎
时间:
2013-5-12 21:46
赵利斌 发表于 2013-5-12 21:23
不是说局部变量和成员变量
这个是这么回事 str1.append(str2)方法是将两个字符串连接之后返回给str1这 ...
这个问题还真是局部变量和成员变量的关系。结合上楼的代码
public class MyClass {
static void aMethod(StringBuffer sf1, StringBuffer sf2) {
sf1.append(sf2);
sf2 = sf1;
System.out.println(sf1);
System.out.println(sf2);
}
public static void main(String[] args){
StringBuffer sf1 = new StringBuffer("A");
StringBuffer sf2 = new StringBuffer("B");
aMethod(sf1,sf2);
System.out .println(sf1+ ":"+sf2);
}
}
复制代码
可以看出 在方法内的sf1和sf2都变成了AB,但是为什么主函数里sf2还是原来的值呢?产生这个问题的原因是因为append(),该方法的api文档说此方法会在 this(目标)对象上实现同步,就是说执行方法aMethod内部的sf1.append(sf2);形参变化的同时,实参sf1也同步变成了AB。所以产生上面效果。
作者:
隨風
时间:
2013-5-12 22:34
这个与局部变量成员变量关系不大,4楼说的对,这个应该是实参与形参的问题
实参是实体参数,即main中的sf1和sf2
形参是函数中传入的参数,它只是对实参的一个引用,形参在函数中发生修改,作用于函数,而不会影响到实参,这aMethod中的sf1和sf2即是形参
所以看到,形参sf2在函数中变化后,没有影响到实参sf2
而实参sf1发生了改变,是因为sf1调用append方法的原因,这个方法操作的是形参引用的对象,也就是实参sf1
所以,最终看到的结果就是:AB:B
作者:
chouwayメ
时间:
2013-5-12 22:44
本帖最后由 chouwayメ 于 2013-5-12 22:47 编辑
4L好给力啊 嗯。楼主你看下这个就比较清楚了
public class MyClass
{
static void aMethod(StringBuffer a1, StringBuffer b2)
{
a1.append(b2);
b2 = a1;
}
public static void main(String[] args)
{
StringBuffer sf1 = new StringBuffer("A");
StringBuffer sf2 = new StringBuffer("B");
aMethod(sf1,sf2);
System.out .println(sf1+ "":"+sf2);
}
}
复制代码
主要形参的名称和实参的名称相同太迷惑了,换成a1 b2就清楚多了。
一:append改变了sf1指向的字符串,所以实参sf1指定的字符串改变了,故输出AB;
二:而在aMethod 方法中 b2=a1 只是把形参a1记录的地址赋给了b2。这并没有改变实参sf2所指向的字符串。(虽然形参a1 b2一开始和实参sf1 sf2记录的地址一样)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2