Java中方法參數(shù)的引用傳遞
java中參數(shù)的傳遞有兩種,分別是按值傳遞和按引用傳遞。按值傳遞不必多說,下面就說一下按引用傳遞。
當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法,這就是所謂的按引用傳遞。 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()); } } 上面代碼的輸出結(jié)果是“hello world”,這不必多說,那如果將set方法改為如下,結(jié)果會(huì)是多少呢? public void set(User user){
答案依然是“hello world”,下面就讓我們來分析一下如上代碼。 首先 User user = new User();是在堆中創(chuàng)建了一個(gè)對(duì)象,并在棧中創(chuàng)建了一個(gè)引用,此引用指向該對(duì)象,如下圖:
test.set(user); 是將引用user作為參數(shù)傳遞到set方法,注意:這里傳遞的并不是引用本身,而是一個(gè)引用的拷貝。也就是說這時(shí)有兩個(gè)引用(引用和引用的拷貝)同時(shí)指向堆中的對(duì)象,如下圖:
user.setName("hello world"); 在set()方法中,“user引用的拷貝”操作堆中的User對(duì)象,給name屬性設(shè)置字符串"hello world"。如下圖:
user=new User(); 在set()方法中,又創(chuàng)建了一個(gè)User對(duì)象,并將“user引用的拷貝”指向這個(gè)在堆中新創(chuàng)建的對(duì)象,如下圖:
user.setName("change"); 在set()方法中,“user引用的拷貝”操作的是堆中新創(chuàng)建的User對(duì)象。
set()方法執(zhí)行完畢,目光再回到mian()方法 System.out.println(user.getName()); 因?yàn)橹埃?user引用的拷貝"已經(jīng)將堆中的User對(duì)象的name屬性設(shè)置為了"hello world",所以當(dāng)main()方法中的user調(diào)用getName()時(shí),打印的結(jié)果就是"hello world"。如下圖:
|
|