當一個對象被當作參數傳遞到一個方法”,這就是所謂的按引用傳遞。
Java代碼
- public class User {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
Java代碼 下載下傳
- 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());