2015-12-02 68 views
0

我是java新手。在閱讀關於Java的介紹性書籍時,我閱讀了以下代碼,並閱讀了最終化方法。在java中用for循環創建多個對象使用相同的對象名來理解finalize方法

class FDemo{ int x; 
FDemo(int i){ 
    x=i; 
} 
protected void finalize(){ 
System.out.println("Finalizing " +x) 
    } 
void generator(int i) { 
FDemo o= new FDemo(i); 
} 
} 

現在在創建對象我遇到了我無法理解我們如何在使用相同的名稱「O」 for循環創建新對象的新類

int count; 

FDemo ob= new FDemo(0); 

for (count=1;count<10000000;count++) 
ob.generator(count); 

以下?我們是否需要創建一個新對象,然後在下一次迭代中放棄整個循環中的現有對象'o'? 另外,如果我們不斷地創建和丟棄同一個對象,爲什麼要最終執行1000萬而不是1000?就像我說的,我是一個初學者,這個問題對大多數人來說可能聽起來很基本或者很愚蠢,但是如果你能花幾分鐘的時間回答,我將非常感激。 謝謝

+0

只是好奇,你是否正在閱讀Java - Herbert Schildt入門指南? –

+0

你需要知道的關於最終確定的事情是,你永遠不應該依賴它。 –

+0

@TT。他只是在學習如何使用它,他並沒有在這裏寫一個真正的程序。 –

回答

0

而且,爲什麼敲定執行了10萬套,但不是1000,如果我們 正在不斷創造並丟棄同一對象

你真的在這個應用程序的生命週期創造千萬不同對象,其中每一個都依次由o引用。

每一次,去引用的一個就符合垃圾收集,因爲它已成爲不可訪問從應用程序,然後垃圾收集器調用它的完成方法。

0

好的我打算把它分解成幾部分。

我們如何使用在相同的名字「O」爲 循環創建新對象?

所以,你在這裏做的實際上只是重寫/重新分配o的引用變量到不同的FDemo。這使舊的空置空,最終被垃圾收集器摧毀。 (這是調用finalize()方法)

我們必須創建一個新的對象,然後在下一次迭代 放棄現有對象「O」整個循環?

那麼這是你在做什麼,當你重新分配啊,你要覆蓋舊的。

另外,爲什麼最後確定執行了10萬套,但不是1000,如果我們 正在不斷創造並丟棄相同的對象?

嗯,這是因爲java的垃圾收集器只在大量的對象被創建時觸發。但是,我很驚訝,100000沒有這樣做。

你必須記住關於finalize()的東西,它只能在對象的垃圾回收集上調用。現在,這是一個非常不可靠的過程,並不在你的控制範圍之內。像@TT一樣。在評論中說,不要依賴這個。你寫的程序簡化強制finalize()方法最終被調用,因爲有意地生成了大量的對象。這是瞭解最終確定及其工作原理的好方法,但實際上這可能不是一個好的解決方案。

+0

是@Ashwin實際上我是以第一次100,000開始的,它沒有工作,所以我嘗試了一千萬 –

0

我們如何在for循環中使用相同名稱'o'創建新對象?

你應該學習一些C以及指針是如何工作的,Java會隱藏它,所以它可能會有些奇怪。在Java中,有2種類型的數據:對象(如String或FDemo)和基元(如int,char ...)。

引用基元的變量就像您打算的那樣工作,每次您給它一個新值時,它就會抹去前一個。 引用對象的變量不會以這種方式工作,它們是指針。指針可以被看作是一個地址。它在C(和C++)中更清晰,它們實際上是原始的,並且可以打印。

接下來是變量的生命期。當你退出聲明變量的部分時,它不再存在(但對象不會自動銷燬,我認爲這是你練習的目的)。 作爲例子:

public void someMethod() { 
    int a = 1; 
    // I have access to a 
    { // I create a new section, generally, it's use by condition, loop... 
     int b = 2; 
     // Here I have access to a and b 
    } // End of my section 
    // b is destroyed, I still have access to a 
} 
// I'm outside my method, a is destroyed 

爲什麼最終確定執行了10萬套,但不是1000,如果我們不斷創造並丟棄相同的對象?

這就是Java的垃圾收集器的目的。這是一個用來清理記憶的大系統。它破壞(調用finalize()方法)所有沒有引用它們的指針的對象。只有在真正需要時纔會調用它,因爲它可以使用大量處理能力(在舊計算機中,垃圾收集器啓動時應用程序可能會凍結)。

你的對象非常簡單(只有1個原語),所以它沒有使用大量的內存。這就是爲什麼只有當您創建10百萬個對象時纔會調用垃圾收集器。

+0

我讀到了書中的原始對象和對象討論,但你的解釋比書中的文本更有幫助。謝謝 –

相關問題