2014-04-01 17 views
8

如果我是正確的本地定義的原始數據類型將在堆棧上。但是,如果原始數據類型被定義爲原始對象堆的實例的一部分。Stack或堆上的Java基元數據類型?

class Test 
{ 
    int y=10; // defined as part of the class 

    public void function1(){ 
     int x = 5; // defined locally 
    } 

    public static void main(String[] args) 
    { 
     Test obj = new Test(); 
    } 
} 

所以在上面的代碼將X的待存儲在堆棧和y在堆上上?我很困惑它們是如何存儲的,它爲什麼重要堆棧或堆?

回答

19

當一個方法被調用時,某些數據被放置在堆棧上。當方法結束時,數據從堆棧中移除。在程序執行的其他時間點,數據被添加到堆棧中,或從中刪除。

因此,如果您有一個旨在超越創建它的方法的執行時間的變量,它需要在堆上。這既適用於您創建的任何對象,也適用於存儲在這些對象中的任何基元。然而,如果一個變量在創建之後不久就會超出範圍 - 也就是說,在創建它的方法的末尾,或者甚至更早,那麼它適合在堆棧上創建該變量。局部變量和方法論證符合這個標準;如果它們是基元,則實際值將位於堆棧上,如果它們是對象,則將引用該對象(但不是對象本身)。

在您的具體示例中,只要function1運行完畢,x就不可用。所以它在堆棧上創建是合理的。在function1的末尾,數據被有效地從棧中刪除,包括x。另一方面,只要包含對象存在,預計變量y仍然存在;如果它是在堆棧上創建的,那麼一旦創建它的對象構造函數完成運行,它就會停止存在。因此必須在堆上創建y

1

實例級變量(也可以是基元)是實例(對象)的一部分。因此,它們將被分配在堆上(作爲對象的一部分)。

方法級別/局部變量:堆棧(用於基元)或堆(堆棧上有引用的對象)。字符串可以在Stack或堆上分配。

6

只有局部原始變量對對象的引用(即在方法中聲明的變量)存儲在堆棧中。其他存儲在堆中

0

當您啓動Test實例時,它的所有字段(如y)都將存儲在堆中。

當您撥打function1時,本地變量x將被推入堆棧。

但是在您的示例中,x未存儲在堆棧中,因爲從未調用過function1

1

我很肯定你現在已經得到了你的答案......有一點需要注意。即使你的變量將被存儲在堆中,當它需要對它們進行操作時,Java仍然會將它們的值加載到堆棧上。這就是JVM的工作方式 - 它是一個堆棧語言

相關問題