Javaの值傳遞和引用傳遞
阿新 • • 發佈:2019-01-09
引用傳遞和值傳遞
java中是沒有指標的,java中只存在值傳遞,只存在值傳遞,只存在值傳遞!!! 然而我們經常看到對於物件(陣列,類,介面)的傳遞似乎有點像引用傳遞,可以改變物件中某個屬性的值。但是不要被這個假象所矇蔽,實際上這個傳入函式的值是物件引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞。
這裡要用實際引數和形式引數的概念來幫助理解,
1.值傳遞:
方法呼叫時,實際引數把它的值傳遞給對應的形式引數,函式接收的是原始值的一個copy,此時記憶體中存在兩個相等的基本型別,即實際引數和形式引數,後面方法中的操作都是對形參這個值的修改,不影響實際引數的值。
public class Test3 {
public static void change(int a){
a=50;
}
public static void main(String[] args) {
int a=10;
System.out.println(a);
change(a);
System.out.println(a);
}
}
輸出的 是10,10。傳遞的是值得一份拷貝,這份拷貝與原來的值沒什麼關係。
2.引用傳遞:
也稱為傳地址。方法呼叫時,實際引數的引用(地址,而不是引數的值)被傳遞給方法中相對應的形式引數,函式接收的是原始值的記憶體地址;
在方法執行中,形參和實參內容相同,指向同一塊記憶體地址,方法執行中對引用的操作將會影響到實際物件
public class Test3 {
public static void change(int []a){
a[0]=50;
}
public static void main(String[] args) {
int[] a={10,20};
System.out.println(a[0]);
change(a);
System.out.println(a[0]);
}
}
輸出結果為10 50。實際傳遞的是引用的地址值。
再看一個例子
class Emp {
public int age;
}
public class Test {
public static void change(Emp emp)
{
emp.age = 1000;
emp = new Emp();//再建立一個物件
emp.age=10000;
}
public static void main(String[] args) {
Emp emp = new Emp();
emp.age = 10;
System.out.println(emp.age);
change(emp);
System.out.println(emp.age);
System.out.println(emp.age);
}
}
輸出10 1000 1000
總結
(1)基本資料型別傳值,對形參的修改不會影響實參;
(2)String, Integer, Double等immutable的型別特殊處理,可以理解為傳值,最後的操作不會修改實參物件。
(3)引用型別傳引用,形參和實參指向同一個記憶體地址(同一個物件),所以對引數的修改會影響到實際的物件;