2013-10-16 42 views
2

創建OBJECT數組時,分配的內存(堆棧和堆引用)如何?

public static student[] arr = new student[10]; 

現在,學生是有一些實例變量name(String)age(int)類。 我想知道,只要這條線被執行會發生什麼? 所有的十個參考文件是否會得到內存,或者我必須單獨分配它們?如果試圖訪問student[5].age會怎麼樣? 我需要知道的內存分配狀態。謝謝...............

+0

爲什麼你不試試看看會發生什麼? –

+0

但我不能看到內存分配的東西:( – Marwadi

+0

對象是否*永遠*存儲在堆棧通常很難確定。請參閱http://stackoverflow.com/questions/2787611/why-does-java-uses -heap-for-memory-allocation – Raedwald

回答

2

public static student[] = new student[10]; 

一旦該行執行,JVM分配內存爲10名學生references。請看official docs on Arrays,看流量。

// declares an array of integers 
     int[] anArray; 

     // allocates memory for 10 integers 
     anArray = new int[10]; 

     // initialize first element 
     anArray[0] = 100; 
+0

大約一年後的愚蠢問題:在anArray = new int blah之後,由於基元不能爲空,數組將填充什麼? – hintss

+0

@hintss在2年後回答對於基元,它們的數組將被初始化爲它們的默認值,對象的默認值(如果沒有分配給它)爲null,整數的默認值爲0。 – ata

0

將所有十個引用獲取內存或I必須分配然後單獨?

您將獲得10個參考的空間。這些引用將被初始化爲null。如果你想讓它們設置爲除null之外的其他任何內容,則必須單獨執行。

1

public static student[] arr = new student[10];會爲10名學生分配內存。這些內存填充null。

所以,你不能訪問student[5].age,因爲對實際對象的引用不存在。

我們需要單獨創建一個像下面

for(int i=0;i<10;i++){ 
    student[i]= new Student(); 
} 

,如果你正在創建的實際對象的引用,你將與NullPointerException異常結束前訪問學生[5]。年齡的對象引用。

3

當執行上面的語句,JVM將創建10個連續的存儲器位置中,每個大到足以容納參照student。但是,如果您願意,該陣列將不包含引用或null。當您執行的語句像arr[0] = new student();一個student對象將在堆上創建,其引用將被保存在arr[0]。請記住,數組也分配在堆上。

所以一旦你創建10個student對象,將各自的地方堆上分配的,但是當你創建對象的數組,它們的引用將被存儲在arr

+0

你是說你的堆棧不會做任何事情嗎? – Marwadi

+0

In你的情況不會,只有在你使用局部變量(包括參數)時纔會使用Stack,例如你有String a = new String(「abc」),現在他們有兩件事情,變量'a'將被創建但是它只會引用在堆上創建的字符串「abc」。所以你在堆中有一個字符串「abc」,它的引用被保存在堆棧的局部變量「a」中。 – ata

+0

也許這可以清除的東西:http://stackoverflow.com/questions/9991701/memory-allocation-in-java-heap-or-stack – ata

2

僅供參考變量將被創建。在你的案例中引用學生類的變量。

在下面的圖像,一組參考變量的被創建。然後,您可以 指向那些參考變量,以實際的對象,後來。

Dog object array

+0

這是什麼書? –

+0

當我出現oracle java認證時,我讀了這本書。 http://www.amazon.com/SCJP-Certified-Programmer-Java-310-065/dp/0071591060 – Sorter