返回信息流p请教大神
ublic class test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder a=new StringBuilder("a");
StringBuilder b=new StringBuilder("b");
System.out.println(a+" "+b);
operate(a,b);
System.out.println(a+" "+b);
}
private static void operate(StringBuilder a, StringBuilder b) {
// TODO Auto-generated method stub
a.append(b);
b=a;
b.append(a);
}
}
输出的答案是
a b
abab b
为什么?
这是一条镜像帖。来源:北邮人论坛 / java / #51190同步于 2016/6/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
引用和值参数传递的问题
lansiluowang
2016/6/24镜像同步18 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 Madness 的大作中提到: 】
: 因为是stringbuilder,所以你append的时候就会改内容,类似于你用的是ref String一样。
operate中 b也append了 咋没改
虽然是用C#写的,但是应该都一样,在进入函数前,两边指向各自的ref
private static void operate(StringBuilder a, StringBuilder b)
{
a.Append(b);//a Append b 所指向的内容“b”
var c = ReferenceEquals(a, b);//此时c的值为false。
b = a;
c = ReferenceEquals(a, b);//此时c的值为true
b.Append(a);//所以这句话跟a.Append(a)没什么不同
}//最后函数退出之后,ref会还原,所以a和b依旧指向自己原来指向的地方,只不过a指向的地方的值变为了"abab",而b指向的地方的值从未更改,依旧是"b".
【 在 lansiluowang 的大作中提到: 】
:
: operate中 b也append了 咋没改
你的operate其实和下面这个实现是等价的:
private static void operate(StringBuilder a, StringBuilder b) {
a.append(b);
a.append(a);
}