Java中方法參數的引用傳遞
java中參數的傳遞有兩種,分別是按值傳遞和按引用傳遞。按值傳遞不必多說,下面就說一下按引用傳遞。
當一個對象被當作參數傳遞到一個方法,這就是所謂的按引用傳遞。 public Class User{ private String name;
public String getName() { return name; } public void setName(String name) { this.name = name; } }
public Class Test { public void set(User user){ user.setName("hello world"); } public static void main(String[] args){ Test test = new Test(); User user = new User(); test.set(user); System.out.println(user.getName()); } } 上面代碼的輸出結果是“hello world”,這不必多說,那如果將set方法改為如下,結果會是多少呢? public void set(User user){
答案依然是“hello world”,下面就讓我們來分析一下如上代碼。 首先 User user = new User();是在堆中創建了一個對象,并在棧中創建了一個引用,此引用指向該對象,如下圖:
test.set(user); 是將引用user作為參數傳遞到set方法,注意:這里傳遞的并不是引用本身,而是一個引用的拷貝。也就是說這時有兩個引用(引用和引用的拷貝)同時指向堆中的對象,如下圖:
user.setName("hello world"); 在set()方法中,“user引用的拷貝”操作堆中的User對象,給name屬性設置字符串"hello world"。如下圖:
user=new User(); 在set()方法中,又創建了一個User對象,并將“user引用的拷貝”指向這個在堆中新創建的對象,如下圖:
user.setName("change"); 在set()方法中,“user引用的拷貝”操作的是堆中新創建的User對象。
set()方法執行完畢,目光再回到mian()方法 System.out.println(user.getName()); 因為之前,"user引用的拷貝"已經將堆中的User對象的name屬性設置為了"hello world",所以當main()方法中的user調用getName()時,打印的結果就是"hello world"。如下圖:
|
|
來自: Levy_X > 《JAVAWEB學習資料》