簡體   English   中英

Java類變量是對類對象的引用嗎?

[英]Is a Java class variable a reference to a class object?

我知道以前曾問過這樣的問題,但我找不到滿意的答案。 假設有一個Java類:

class Foo{
    public int k;
    Foo(int a){
         k=a;
    } 
}
class My{
    public static void main(String args[]){
        Foo obj = new Foo(5);//1
        obj=new Foo(8); //2
    }
}

我想知道是否可以將obj假定為對對象的foo類型的引用。 根據我在第1行中的理解,JVM制作了一個新的foo類型的對象並將其引用傳遞給obj,但在第2行中,我們能夠使用新對象超載obj的值。

所以我的問題是,如果obj是一個引用,那么它不應該僅指向一個對象(從c ++派生此定義,引用就像常量指針一樣)。

您的理解是完全正確的。 obj現在指向第二個foo對象。 在這種情況下,任何對象都不會引用foo(5),並且JVM將對其進行垃圾回收。

obj是對foo類型的對象的引用,您的理解是正確的。 在第1行中,JVM創建了一個foo類型的新實例(ojbect)(在堆中分配了新內存),並且obj現在存儲對該內存位置的引用,假設內存位置為1001 所以在第一行之后

obj -> 1001

在第2行之后,JVM創建了一個相同類型foo的新對象(即在堆中分配了完全新的內存),假設這次是2001 ,是分配給新對象的內存,現在在第2行之后, obj的引用是更新並從1001改為2001

obj -> 2001

在第2行之后,在內存位置1001中分配的對象在代碼中沒有任何引用,因此最終JVM將對該內存進行垃圾回收,這意味着,它將釋放內存以供將來分配給其他對象。

Java中的引用不同於C ++,它們不是常量指針,您可以將它們視為c ++的普通pointers ,可以在給定限制的情況下隨時更改其引用/指向的內存位置。相同類型的內存位置,即對象必須是相同類型( foo

Foo obj在Java中創建一個reference variable ,該reference variable可以保存對該類對象的引用。

new Foo(); 語句實際上創建一個對象。 編寫new Foo();次數就很多new Foo(); 將創建一個新對象。

如果obj是一個引用,則不應僅指向一個對象

不,不是這樣。 一個參考變量只能指向一個對象並沒有任何限制。 它可以指向任何對象。

我會說它類似於以下內容,

int a = 10;
a = 15;

並且,正如其他用戶已經發布的那樣,可以將Java中沒有指向它的引用變量的對象收集為垃圾。

Foo obj = new Foo(5);//1

聲明+實例+初始化

obj = new foo(8);

實例化+初始化

我在“ obj = new foo(8);”之前和之后在您的程序中打印obj。

foo obj = new foo(5);// 1
System.out.println("Before:" + obj);
obj = new foo(8); // 2
System.out.println("After:" + obj);

輸出是

Before:com.test.foo@1db9742
After:com.test.foo@106d69c

您可以從此輸出中輕松了解到new foo(8); 語句實際上創建了一個新對象。

欲了解更多,請參閱Java文檔創建對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM