天天看點

java方法的引用傳遞_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();

是在堆中建立了一個對象,并在棧中建立了一個引用,此引用指向該對象,如下圖:

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

test.set(user);

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

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

user.setName("hello world");

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

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

user=new User();

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

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

user.setName("change");

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

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

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

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

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

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