首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

【Java每日一題】20170110:引用傳遞陷阱——方法內 new 對象能否改變外部引用?

     編輯:Java 綜合教學

【Java每日一題】20170110:引用傳遞陷阱——方法內 new 對象能否改變外部引用?

經典 Java 參數傳遞題目:Java 只有值傳遞,引用傳遞的是「引用的值(地址)」。方法內對參數重新賦值(new 新對象)不會影響外部實參引用;但調用對象方法修改內部狀態會影響外部對象。

題目代碼

package Jan2017;
public class Ques0110 {
    public static void main(String[] args) {
        Person person = new Person("張三");
        System.out.println("修改之前 " + person); // 輸出?
        Ques0110.update(person);
        System.out.println("修改之後 " + person); // 輸出?
    }
    public static void update(Person person) {
        person = new Person("李四"); // 關鍵行
    }
}
class Person {
    String name;
    Person(String name) { this.name = name; }
    public String toString() { return "name: " + name; }
}

問題

請問主程序修改後輸出結果是?

答案與解析

輸出結果:

修改之前 name: 張三
修改之後 name: 張三

詳細解析

  1. main 中:`person` 引用指向堆內存中 new Person("張三") 對象(地址假設 0x100)。
  2. 調用 update(person):值傳遞,將 `person` 的值(地址 0x100)複製給形參 `person`(棧幀中新變量,地址假設 0x200)。此時兩個引用指向同一對象。
  3. update 方法內:`person = new Person("李四")` → 在堆中創建新對象(地址 0x300),將形參 person 指向 0x300。main 中的實參 person 仍指向 0x100,完全不受影響。
  4. 返回 main:形參銷毀,實參 person 依然指向原對象 "張三"。

對比:若修改對象內部狀態

輸出將變為:

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved