你真的了解引用传递与值传递吗?
生活随笔
收集整理的這篇文章主要介紹了
你真的了解引用传递与值传递吗?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.方法參數的兩種類型
- 2.方法參數的規則
- 3.代碼驗證
- 3.1一個方法不能修改一個基本數據類型的參數
- 3.2一個方法可以改變一個對象參數的狀態
- 3.3一個方法不能讓對象引用一個新的對象
- 4.一個案例進一步理解方法調用
本文已同步到:https://www.bithachi.cn/posts/255ba281.html
1.方法參數的兩種類型
- 形參是基本數據類型:將實參基本數據類型變量的“數據值”傳遞給形參
- 形參是引用數據類型:將實參引用數據類型變量的“地址值”傳遞給形參
嚴格點說其實只有一種:值傳遞。 即將實際參數(基本數據類型或引用數據類型)值的副本傳入方法內,而參數本身不受影響。
2.方法參數的規則
- 一個方法不能修改一個基本數據類型的參數(byte,short,int,long,float,double,char,boolean)
- 一個方法可以改變一個對象參數的狀態
- 一個方法不能讓對象引用一個新的對象
3.代碼驗證
3.1一個方法不能修改一個基本數據類型的參數
說明:
調用tripleValue這個方法之 后,percent 的值還是 10。
下面看一下具體的執行 過程:
- 1 ) x 被初始化為 percent 值的一個拷貝(也就 是 10 )
- 2 ) x 被乘以 3后等于 30。 但是 percent 仍然 是 10
- 3 ) 這個方法結束之后,參數變量 X 不再使用。
3.2一個方法可以改變一個對象參數的狀態
說明:
具體的執行過程為:
- 1 ) X 被初始化為 harry 值的拷貝,這里是一個對象的引用。
- 2 ) raiseSalary 方法應用于這個對象引用。x 和 harry 同時引用的那個 Employee 對象的薪金提高了 200%。
- 3 ) 方法結束后,參數變量 x 不再使用。
- 當然,對象變量 harry 繼續引用那個薪金增至 3 倍的雇員對象
3.3一個方法不能讓對象引用一個新的對象
說明:
- 方法并沒有改變存儲在變量 a 和 b 中的對象引用。
- swap 方法的參數 x 和 y 被初始 化為兩個對象引用的拷貝,這個方法交換的是這兩個拷貝。
- 在方法結束時局部變量變量 X 和 y 從棧區出棧,被丟棄了。原來的變量 a 和 b 仍然引用 這個方法調用之前所引用的對象
這個過程說明:Java 程序設計語言對對象采用的不是引用調用,實際上, 對象引用是按值傳遞的。
對象引用按值傳遞,即方法傳遞的是這兩個對象引用的值,可以理解為地址,就像基本數據類型一樣,我們不能改變著兩個引用值/地址,但是我們卻可以改變這兩個引用值指向的對應對象的狀態值
4.一個案例進一步理解方法調用
public class Test {public void second(Value v, int i) {i = 0;v.i = 20;Value val = new Value();v = val;System.out.println(v.i + " " + i);}public void first() {int i = 5;Value v = new Value();v.i = 25;second(v, i);System.out.println(v.i);}public static void main(String[] args) {Test test = new Test();test.first();}class Value {int i = 15;} }總結
以上是生活随笔為你收集整理的你真的了解引用传递与值传递吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.1.2 操作系统内存管理管些什么?
- 下一篇: 2.3.3 浮点数的加减运算与强制类型