天天看點

JAVA中方法參數的引用傳遞

當一個對象被當作參數傳遞到一個方法”,這就是所謂的按引用傳遞。

Java代碼  

  1. public class User {  
  2.     private String name;  
  3.     public String getName() {  
  4.         return name;  
  5.     }  
  6.     public void setName(String name) {  
  7.         this.name = name;  
  8. }  

Java代碼  下載下傳

  1. public class Test {  
  2.     public void set(User user){  
  3.         user.setName("hello world");  
  4.     public static void main(String[] args) {  
  5.         Test test = new Test();  
  6.         User user = new User();  
  7.         test.set(user);  
  8.         System.out.println(user.getName());  

 上面代碼的輸出結果是“hello world”,這不必多說,那如果将set方法改為如下,結果會是多少呢?

  1.  public void set(User user){  
  2.     user.setName("hello world");   
  3.     user = new User();   
  4.     user.setName("change");   
  5.   }  

   答案依然是“hello world”,下面就讓我們來分析一下如上代碼。

 首先:

  1. User user = new User();  

   是在堆中建立了一個對象,并在棧中建立了一個引用,此引用指向該對象,如下圖:

  1. test.set(user);  

   是将引用user作為參數傳遞到set方法,注意:這裡傳遞的并不是引用本身,而是一個引用的拷貝。也就是說這時有兩個引用(引用和引用的拷貝)同時指向堆中的對象,如下圖:

  1. user.setName("hello world");  

   在set()方法中,“user引用的拷貝”操作堆中的User對象,給name屬性設定字元串"hello world"。如下圖:

  1. user = new User();  

   在set()方法中,又建立了一個User對象,并将“user引用的拷貝”指向這個在堆中新建立的對象,如下圖:

  1. user.setName("change");  

   在set()方法中,“user引用的拷貝”操作的是堆中新建立的User對象。

   set()方法執行完畢,目光再回到mian()方法

System.out.println(user.getName());      

繼續閱讀