文章优先发布在个人博客,后续如果修改忘记同步到CSDN给你带来不便,抱歉。
个人博客本文地址:https://www.xdx97.com/article?bamId=671021641165176832
其实我在学Java的时候对值传递和地址值传递这两个概念没啥感觉
也可能是我自己没太注意,但是在学习c语言的时候对这两个概念倒是印象深刻
下面就我对这两个概念的理解来阐述一下:为什么Java只有值传递
1、什么是形参什么是实参
// 这个参数xdx 就是形参
public void fun(XdxTest xdx){
System.out.println("say : " + xdx);
}
public static void main(String[] args) {
XdxTest t = new XdxTest();
// 这个地方传递的t 就是实参
t.fun(t);
}
2、什么是值传递什么是地址值传递
值传递: 对形参所作的任何改变都不会对实参有任何影响。
你可以这样理解,我有一把钥匙,然后我配了一把,我把配的一把给你了。
你对我给你的钥匙做任何操作,比如折断。对于我手里的钥匙是没有任何影响的。
地址值传递: 对形参做任何操作都会影响到实参的。
我直接把原配的钥匙给了你,如果你把它折断的话,对我肯定有影响啦。
3、Java中的引用传递
通过上面的解释我们很容易就理解的值传递和地址值传递,我们常说Java中只有值传递,但是为什么在Java中我们对形参做改变的时候(比如重新赋值),对实参还是有影响呢?
比如下面这个代码:
public class XdxTest {
private int count = 1;
// 这个参数xdx 就是形参
public void fun(XdxTest xdx){
xdx.count = 2;
}
public static void main(String[] args) {
XdxTest t = new XdxTest();
System.out.println(t.count);
// 这个地方传递的t 就是实参
t.fun(t);
System.out.println(t.count);
}
}
# 打印结果
1
2
我们传递过去的参数,不是当前对象,而是该对象的一个引用,它也是指向当前对象的。
对象和对象的引用:一个对象可以有多个引用,对于和对象的引用就像气球和绳子之前的关系一样。
所以我们对这个对象的引用做的任何操作当然会反应到对象本身呀。
但是如果我们在方法里面,让这个对象引用指向其它对象,这时候再对引用做任何操作就不会对实参有任何改变了。这也就证明了Java里面的引用传递本质上还是值传递。
public class XdxTest {
private int count = 1;
// 这个参数xdx 就是形参
public void fun(XdxTest xdx){
xdx = new XdxTest();
xdx.count = 2;
}
public static void main(String[] args) {
XdxTest t = new XdxTest();
System.out.println(t.count);
// 这个地方传递的t 就是实参
t.fun(t);
System.out.println(t.count);
}
}
打印结果:
1
1