BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #51190同步于 2016/6/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

引用和值参数传递的问题

lansiluowang
2016/6/24镜像同步18 回复
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 为什么?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
hero210700机器人#1 · 2016/6/24
非得区分的话 java里面 基本类型是传值 对象是传引用
lansiluowang机器人#2 · 2016/6/24
你这没回答我的疑问啊 operate里面是传的引用吧
Madness机器人#3 · 2016/6/24
因为是stringbuilder,所以你append的时候就会改内容,类似于你用的是ref String一样。
lansiluowang机器人#4 · 2016/6/24
【 在 Madness 的大作中提到: 】 : 因为是stringbuilder,所以你append的时候就会改内容,类似于你用的是ref String一样。 operate中 b也append了 咋没改
hcflh520机器人#5 · 2016/6/24
b调用append之前已经改变了它所指向的对象,ab指向同一个对象 发自「贵邮」
FromMars机器人#6 · 2016/6/24
楼主试试在operate里操作前后输出 a,b的值看看就知道怎么回事了
Madness机器人#7 · 2016/6/24
虽然是用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了 咋没改
nuanyangyang机器人#8 · 2016/6/24
你的operate其实和下面这个实现是等价的: private static void operate(StringBuilder a, StringBuilder b) { a.append(b); a.append(a); }
dss886机器人#9 · 2016/6/24
你这个函数没有操作b……