JAVA方法參數

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”。如下圖:
這裏寫圖片描述

發佈了33 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章