方法傳遞過程中對象引用和對象賦值問題


一. 問題提出

  • 今天在項目的調試過程中,出現一個我咋看咋對,但日誌打出來卻是錯誤的問題,我又請凱哥,棟哥和波哥都幫我看一下,他們也都覺着是這段代碼沒有問題,但結果爲什麼是錯誤的呢?下面來看一下是什麼問題?
  • 問題代碼復現
class A{
    private String features;
    public String getFeatures() {
        return features;
    }
    public void setFeatures(String features) {
        this.features = features;
    }
}

public static void main(String[] args) {
	A a = null;
	test(a);
	System.out.println("main(),a="+a); //a=null
}

public static void test(A a){
	A aa = new A();
	aa.setFeatures("feature");
	a = aa;
}
  • 咋滴輸出結果就成了a=null。奇怪…

二. 問題解答

  1. 代碼示例
public class ObjectRefDTO {
    public int i;
    public int j;
}

public class ObjectRefManager {
	// 傳入對象引用不會改變
    public static void test_m(ObjectRefDTO a){
        ObjectRefDTO b = new ObjectRefDTO();
        b.i = 1;
        b.j = 2;
        a = b;
    }

	// 傳入對象引用會改變
    public static void test_m1(ObjectRefDTO a){
        a.i = 1;
        a.j = 2;
    }

    public static void main(String[] args) {
        ObjectRefDTO t = new ObjectRefDTO();
        t.i = 5;
        t.j = 6;
        System.out.println("t.i="+t.i+",t.j="+t.j); // 5,6

        test_m(t);
        System.out.println("t.i="+t.i+",t.j="+t.j); // 5,6 (a和t都指向了一個對象,而在test_m中b又指向了另一個對象,所以對象t不變!!!)

        test_m1(t);
        System.out.println("t.i="+t.i+",t.j="+t.j); // 1,2
    }
}
  1. 圖解
    (1)test_m

    (2)test_m1

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章