Java中的传参问题
/ / 点击 / 阅读耗时 3 分钟背景
最近在学习Java,我一直有一个疑惑——Java中的传参究竟是什么方式?pass by value?pass by reference?还是会变化?在PL课上,老师讲到了如下的问题:
在这个问题中,答案又应该是什么呢?
思考与解答
首先说结论,我认为Java中的传参都可以看做是pass by value;如果参数是一个对象,那么实际上传递的就是一个指向对象的指针的拷贝。
我们看这样一个例子:
1 | package JavaPlayGround; |
在上面的例子里,fooByModify
与fooByAssign
分别对传入的对象进行修改/赋值,而只有前者真正改了原先的对象,后者则对原先的对象没有任何影响。
我的理解如下:
不妨假设myDog指向地址3,那么调用fooByModify
时,d
也指向地址3(相当于复制了myDog的地址),故而之后的改变都会影响到地址3的myDog。
在调用fooByAssign
时,事情有所不同。d
一开始指向地址3,但是随后被赋值(记住,此处的d
和myDog没有关系,它只是保存了一个地址罢了),故而d
指向了一个新的地址,之后的修改也就自然没有任何变化了。
至于PL课上提出的问题,语焉不详(不清楚调用constructor之后的内部行为),无法给出详尽的解释。
参考
感谢阅读!欢迎评论嗷~