这是一个风和日丽的上午,
如果你看到了我的文章,
我想,
这是巧合,
这不是巧合,
这是一个必然,
一个你看了廖雪峰老师的文章 方法 | 廖雪峰 之后,
想搞明白,
才有了这次遇见!
从而众里寻答千百度,
蓦然回首,
来到了我这里。
话不多说,
抛出结论
1. 基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响。
2. 引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。
public class Main {
public static void main(String[] args) {
Person p = new Person();
String bob = "Bob";
p.setName(bob); // 传入bob变量
System.out.println(p.getName()); // "Bob"
bob = "Alice"; // bob改名为Alice
System.out.println(p.getName()); // "Bob"还是"Alice"?
}
}
class Person {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
不要怀疑引用参数绑定的机制,试解释为什么上面的代码两次输出都是"Bob"?
分析图
我自己画了一个图,
大致是这样的,
请各位看官欣赏:
根据【抛出结论】进入
你问我答环节
引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。
你问: 调用方的变量,是谁?
我答: 这还不简单嘛,一看就知道, p.setName(bob); 中的bob,是调用方的变量 。
你问:接收方的参数变量,是谁?
我答:你你你,你在侮辱我?肯定是name啊。
public void setName(String name) {
this.name = name;
}
你问:回归结论,看这句话,【指向的是同一个对象 】,来,你说谁,这个对象,是谁?
我答:是"Bob"这个字符串对象。
你问:确定指向的对象是"Bob"吗,而不是字符串变量 bob?
我答:确定,不是字符串变量bob,字符串变量bob是调用方的变量!
你问:再看结论这句话,【双方任意一方对这个对象的修改,都会影响对方】。你来说说,bob="Alice"做了什么?或者说是bob修改了字符串Bob了吗?
我答:啥玩意?你一个bob还想修改字符串Bob?你怕不是傻了吧?Java语言中,明确说明了,字符串变量一旦定义,就无法修改!!!
我答:语句bob = "Alice",仅仅是改变了自身(bob)的引用而已,由原来的引用"Bob",现在引用了"Alice"。而对于我们前面提到的调用方与参数变量双方,并没有修改"Bob"(过呢本没有这个能力修改),所以,既然双方没有修改对象Bob,那么就谈不上影响对方。
所以,当我们输出的时候,
还是p.getName()的输出仍然是:Bob。
【分析到此结束】
话说回来,如果程序这样写:
增加一条语句,
再次写入p.setName(bob);
这是后会发生什么呢?
看图:
想都不用想,
这时候,
会输出Alice。
上面提到的双方都没有修改对象,自然谈不上对对方产生影响。
那什么时候,是一方修改了对象,会对另一方造成影响呢?
那就是廖雪峰老师举的参数绑定为数组的例子,
这个通过画图的例子,
应该不难理解,
对我来说,
就是这个Bob \ Alice的例子,
令人头疼,
特经上述分析,
与大家分享,
欢迎多多交流。
求真务实
熟能生巧
抓紧时间