文章優先發布在個人博客,後續如果修改忘記同步到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