1.概念 值傳遞:方法調用時,實際傳入的是它的副本,在方法中對值的修改,不影響調用者的值。 引用傳遞:方法調用時,實際傳入的是參數的實際記憶體地址,調用者和調用方法所操作的參數都指向同一記憶體地址,所以方法中操作會影響調用者。 2.問題 ① 值傳遞傳入的值,是它的副本是什麼意思? 列印結果: 0 此處調 ...
1.概念
值傳遞:方法調用時,實際傳入的是它的副本,在方法中對值的修改,不影響調用者的值。
引用傳遞:方法調用時,實際傳入的是參數的實際記憶體地址,調用者和調用方法所操作的參數都指向同一記憶體地址,所以方法中操作會影響調用者。
2.問題
① 值傳遞傳入的值,是它的副本是什麼意思?
public static void main(String[] args) { int a = 0;
testValue(a); System.out.println(a); } public void testValue(int a) { a = 8; }
列印結果: 0
此處調用方法後,a的值依然沒有變化。
②當傳入的值是一個對象時,也不會發生變化麽?
package com.test; public class TestDemo { public static void main(String[] args) { TestDemo2 testDemo2 = new TestDemo2(); System.out.println("調用前:" + testDemo2.hashCode()); testValue(testDemo2); System.out.println("調用後:" + testDemo2.hashCode()); } public static void testValue(TestDemo2 testDemo) { testDemo = new TestDemo2(); } } class TestDemo2 { int age = 1; }
列印結果:
調用前:366712642
調用後:366712642
這裡可以看到testDemo2 的值依然沒有變化,調用前後所指向的記憶體地址值是一樣的。對傳入地址值的改變並不會影響原來的參數。
③既然是值傳遞,為什麼參數是引用類型的時候,方法內對對象進行操作會影響原來對象,這真的是值傳遞麽?
package com.test; public class TestDemo { public static void main(String[] args) { TestDemo2 testDemo2 = new TestDemo2(); System.out.println("調用前:" + testDemo2.age); testValue(testDemo2); System.out.println("調用後:" + testDemo2.age); } public static void testValue(TestDemo2 testDemo) { testDemo.age = 9; } } class TestDemo2 { int age = 1; }
列印結果
調用前:1
調用後:9
對於這種情況的解釋是,傳入的參數是testDemo2 對象地址值的一個拷貝,但是形參和實參的值都是一樣的,都指向同一個對象,所以對象內容的改變會影響到實參。
綜上所述:JAVA的參數傳遞確實是值傳遞,不管是基本參數類型還是引用類型,形參值的改變都不會影響實參的值。如果是引用類型,形參值所對應的對象內部值的改變
會影響到實參。
如有疑問或寫的不恰當的地方歡迎在評論區指出!!