返回信息流------
##
看了各位大神的回复,自己后来也想了一下
今天突然脑袋转圈。。。。似乎明白为什么了。
说一下自己的理解:
- `//1`:`new`一个`Value`对象,`v`是这个对象的引用,这时对象中`i`的值为初始值`15`
- `//2`:通过引用`v`改变`i`的值,这时对象中`i`的值为`25`
- `//3`:**Thinking in java**中说到:
>如果`java`是传值,那么传递的是值的副本;如果是传引用,那么传递的是引用的副本。
所以这里只是把引用`v`的一个拷贝传到方法`second`中
- `//4`:因为`second`中的`v`是`first`中`v`的一个拷贝,所以二者都指向内存中同一个对象,通过引用的副本来改变原对象的值
- `//5`:这是重新`new`一个新对象,没什么好说的
- `//6`:相当于把引用的副本指向刚才生成的新的对象。但是`first`中的`v`引用并没有改变,还是指向原来的对象。这也就解释了为什么代码行`//8`中依然打印的是`20`而不是`15`
----
```java
public class Demo4 {
public static void main(String[] args) {
Demo4 test = new Demo4();
test.first();
}
public void first(){
int i = 5;
Value v = new Value(); //1
v.i = 25; //2
second(v,i); //3
System.out.println(v.i); //8
}
private void second(Value v, int i) {
i = 0;
v.i = 20; //4
Value val = new Value(); //5
//System.out.println(val);
//System.out.println(v);
v = val; //6 这行代码不是已经将v指向val了吗 为什么v的值没有变first中的v后来还打印20
System.out.println(v.i+" "+i);//7
}
}
class Value{
int i = 15;
}
```
## 为什么打印结果是15 0 20
## 我想的是15 0 15
求大神看看啊
这是一条镜像帖。来源:北邮人论坛 / java / #54376同步于 2016/12/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java引用传递
shixu
2016/12/20镜像同步16 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 nuanyangyang 的大作中提到: 】
: 你明明有4个println,怎么只有3个数字呢?
啊 暖神果然好眼力。那两行代码是我后来加的,已经注释掉。
你觉得修改了second里面的形参v会改变first里面的实参v吗?不会的。
【 在 shixu 的大作中提到: 】
:
: 啊 暖神果然好眼力。那两行代码是我后来加的,已经注释掉。
【 在 nuanyangyang 的大作中提到: 】
: 你觉得修改了second里面的形参v会改变first里面的实参v吗?不会的。
:
传入second的是fisrt中v的引用副本,既然改变引用副本的成员变量会造成原引用的成员变量改变,那为什么将引用副本指向别的引用就不会变呢
引用是副本,但对象不是。
【 在 shixu 的大作中提到: 】
:
: 传入second的是fisrt中v的引用副本,既然改变引用副本的成员变量会造成原引用的成员变量改变,那为什么将引用副本指向别的引用就不会变呢
个人觉得,把参数传递看做“形参 = 实参”的变量初始化过程还是相对好理解的,学过C++的应该不会对引用传递这个概念感到迷惑。
————
微博 @flowmemo 主要写JavaScript.
此签名通过「北邮人签名档」脚本发送