天天看點

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方法改成以下,結果會是多少呢?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

java方法參數 引用傳遞_JAVA中方法參數的引用傳遞

test.set(user);

是将引用user做為參數傳遞到set方法,注意:這裡傳遞的并非引用自己,而是一個引用的拷貝。也就是說這時有兩個引用(引用和引用的拷貝)同時指向堆中的對象,以下圖:對象

java方法參數 引用傳遞_JAVA中方法參數的引用傳遞

user.setName("hello world");

在set()方法中,“user引用的拷貝”操做堆中的User對象,給name屬性設定字元串"hello world"。以下圖:blog

java方法參數 引用傳遞_JAVA中方法參數的引用傳遞

user = new User();

在set()方法中,又建立了一個User對象,并将“user引用的拷貝”指向這個在堆中建立立的對象,以下圖:字元串

java方法參數 引用傳遞_JAVA中方法參數的引用傳遞

user.setName("change");

在set()方法中,“user引用的拷貝”操做的是堆中建立立的User對象。get

java方法參數 引用傳遞_JAVA中方法參數的引用傳遞

set()方法執行完畢,目光再回到mian()方法it

System.out.println(user.getName());

由于以前,"user引用的拷貝"已經将堆中的User對象的name屬性設定為了"hello world",是以當main()方法中的user調用getName()時,列印的結果就是"hello world"。以下圖:

java方法參數 引用傳遞_JAVA中方法參數的引用傳遞