Java語言的參數傳遞只有「按值傳遞」java
基本數據類型都是保存在棧內存中,引用對象在棧內存中保存的是其地址。方法的參數傳遞是傳遞值(變量在棧內存當中的值)。spa
TransferTest1.java3d
1 public class TransferTest1 { 2 public static void main(String[] args) { 3 int num = 1; 4 System.out.println("before num = " + num); 5 changeNum(num); 6 System.out.println("after num = " + num); 7 } 8 public static void changeNum(int x) { 9 x = 2; 10 } 11 }
運行結果:code
傳遞過程示意以下:對象
num做爲參數傳遞給changeNum()方法時,是將內存空間中num所指向的那個存儲單元中存放的值1傳遞給了changeNum()方法中的x變量,而這個x變量也在內存空間中分配了一個存儲單元,這個時候,就把num的值1傳遞給了x的這個存儲單元中。此後,在changeNum()方法中對x的一切操做都是針對x所指向的這個存儲單元,與num所指向的那個存儲單元沒有關係了。因此,在changeNum()方法調用之後,num所指向的存儲單元的值仍是沒有發生變化,這就是所謂的「按值傳遞」。按值傳遞的精髓是:傳遞的是存儲單元中的內容,而不是存儲單元的引用!blog
TransferTest2.java 內存
1 public class TransferTest2 { 2 public static void main(String[] args) { 3 Person person = new Person(); 4 System.out.println(person); 5 change(person); 6 System.out.println(person); 7 } 8 public static void change(Person p) { 9 p = new Person(); 10 } 11 } 12
13 class Person { 14
15 }
運行結果:class
兩次打印person的地址值是同樣的,即調用完change()方法以後,person變量並無發生改變。變量
傳遞過程的示意圖以下:數據類型
當執行到第3行代碼時,程序在堆內存中開闢了一塊內存空間用來存儲Person類的實例對象,同時在棧內存中開闢了一個存儲單元用來存儲該實例對象的引用,即上圖中person指向的存儲單元。當執行到第5行代碼時,person做爲參數傳遞給change()方法,須要注意的是person將本身存儲單元的內容傳遞給了change()方法的p變量。此後,在change()方法中對p的一切操做都是針對p所指向的存儲單元,與person所指向的那個存儲單元沒有關係了。