class Test{
public void main(){
User nb = new User("AA");
change(nb);
System.out.println(nb.name);
}
void change(User user){
//操作一
user.setxxx("BB");
//操作二
user = new User("CC");
}
}
回答‘BB’的小伙伴恭喜你答对了,其他打错的小伙伴也不要灰心,听我讲完你就懂为什么了。
答对的小伙伴能否回答我两个问题:
- 方法调用过程中,实际参数是如何赋值到形式参数的?
- 操作二中直接改变形参指向的地址,为什么实参没有影响?
如果能正确回答上面两个问题的小伙伴请直接划走,如果不知道怎么回答的小伙伴那么恭喜你,你要继续听我BB了。
- 第一我们要搞懂:实际参数与形式参数的传递过程发生了什么?
所有的语言都逃不过三种传递过程:
- 值传递:就是我直接将实参复制一份,然后丢给你形参使用。这个时候如果我直接修改形参执行的对象的值或者重新对形参赋值,都对实参没有任何影响。因为“实”和“形”不在同一个空间,不在同一个维度。你影响不了我,我影响不了
- 引用传递:就是我直接将实参赋值给你形参,不进行复制。你看我对你多好,形参,你想怎么修改对象都行,尽管修理他。这个时候如果我直接修改形参指向对象的值或者重新对形参赋值,都对实参产生影响。类似于:甲方爸爸给你一个紧急任务,到你手上之后,做的惨不忍睹。甲方爸爸看后直接把你炒鱿鱼。
- 共享对象传递:重点来了,小伙伴们。为了削弱引用传递的权力,专门设计这个一个东西。削弱什么能力呢?1.形参可以直接操作指向的对象(操作一) 2.形参可被重新赋值(操作二)。能看出形参在引用传递的时候拥有两种权力,那么共享对象传递其实削弱了第二种权力。也就是当形参被重新赋值时,不会对实际参数有任何的影响。类似于:我把儿子交给你剪头发,你想怎么剪都行。但是你不能把你的发型给我看,就当我儿子剪了一个帅气的头发。
好啦本编文章吹波结束,还有不懂的小伙伴可以参考下方的链接
javaer
网友评论