我有一個 java pojo 類,如下所示
public class ClassA {
private String a;
private String b;
private String c;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
}
我在另一個班級中使用它,如下所示
public class Test {
public static void main(String[] args) {
ClassA ca1 = new ClassA();
ca1.setA("One");
ClassA ca2 = new ClassA();
ca2 = ca1;
System.out.println(ca2);
}
}
輸出是: ClassA@53bd815b[a=One,b=<null>,c=<null>]
是否有可能當我將 ca1 分配給 ca2 時,ca2 將只有屬性“a”而沒有其他屬性“b”和“c”,因為沒有為它們分配值?
uj5u.com熱心網友回復:
您的代碼:
ClassA ca2 = new ClassA();
ca2 = ca1;
… 沒有意義。你實體化一個新的 class 物件ClassA。您分配對該物件的參考以存盤在名為 的參考變數中ca2。然后立即將另一個對不同物件的參考分配給同一個參考變數ca2。
所以這兩行中的第一行沒有意義。從邏輯上講,您可以用以下內容替換這兩行,并最終獲得相同的效果。
ClassA ca2 = ca1;
你問:
是否有可能當我將 ca1 分配給 ca2 時,ca2 將只有屬性“a”而沒有其他屬性“b”和“c”,因為沒有為它們分配值。
如果您問第二個ClassA物件是否可以以某種方式吸收第一個物件的值,答案是“否”。
您的兩個實體ClassA彼此獨立且不同。每個都有自己的狀態(成員欄位值)。該狀態不會因您將參考分配給參考變數而改變。
在您的問題代碼中,您最終在記憶體中有兩個物件:
- 一個有一個成員欄位分配了一個值,另外兩個產量為空。該物件有兩個指向它的參考變數。
- 另一個物件的所有三個成員欄位都為空,這三個欄位都沒有賦值。這個物件沒有指向它的參考。沒有參考意味著這個物件實際上被“遺忘”或丟失了。該物件現在是垃圾回收的候選物件。垃圾回收后,此物件使用的記憶體將被釋放以用于其他目的。
這里的關鍵概念是ca1和ca2本身不是物件。它們是參考變數,也稱為指標。他們知道在哪里可以找到特定的物件。它們可以分別指向不同的物件,也可以都指向同一個物件。
請參閱我在另一個類似問題的回答中制作的插圖。
當您宣告時ClassA ca2,您并不是說 that ca2 is a ClassA,您是說ca2將跟蹤該類的物件在記憶體中的位置,并且僅跟蹤該類(及其子類)。
至于toString被 隱式呼叫的輸出System.out.println,您應該覆寫toString自己以生成您選擇的任何輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/315785.html
下一篇:如何在嵌套的物件陣列中找到索引?
