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){
user.setName("hello world");
user = new User();
user.setName("change");
}
答案依然是“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"。如下圖: