“當一個對象被看成參數傳遞到一個方法”,這就是所謂的按引用傳遞。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方法改成以下,結果會是多少呢?shell
public void set(User user){
user.setName("hello world");
user = new User();
user.setName("change");
}
答案依然是“hello world”,下面就讓咱們來分析一下如上代碼。this
首先:3d
User user = new User();
是在堆中建立了一個對象,并在棧中建立了一個引用,此引用指向該對象,以下圖:code
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO4AjNldDM5MWO5QGNyEWZhFTNzUjZhZjYzUGOzEmYm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
test.set(user);
是将引用user做為參數傳遞到set方法,注意:這裡傳遞的并非引用自己,而是一個引用的拷貝。也就是說這時有兩個引用(引用和引用的拷貝)同時指向堆中的對象,以下圖:對象
user.setName("hello world");
在set()方法中,“user引用的拷貝”操做堆中的User對象,給name屬性設定字元串"hello world"。以下圖:blog
user = new User();
在set()方法中,又建立了一個User對象,并将“user引用的拷貝”指向這個在堆中建立立的對象,以下圖:字元串
user.setName("change");
在set()方法中,“user引用的拷貝”操做的是堆中建立立的User對象。get
set()方法執行完畢,目光再回到mian()方法it
System.out.println(user.getName());
由于以前,"user引用的拷貝"已經将堆中的User對象的name屬性設定為了"hello world",是以當main()方法中的user調用getName()時,列印的結果就是"hello world"。以下圖: