Java參數傳遞

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所指向的那個存儲單元沒有關係了。

相關文章
相關標籤/搜索