2012-12-14 61 views
1

我寫了一個簡單的程序來演示垃圾收集。下面是代碼:垃圾收集演示程序不編譯

public class GCDemo{ 

public static void main(String[] args){ 
    MyClass ob = new MyClass(0); 
    for(int i = 1; i <= 1000000; i++) 
     ob.generate(i); 
} 

/** 
* A class to demonstrate garbage collection and the finalize method. 
*/ 
class MyClass{ 
    int x; 

    public MyClass(int i){ 
     this.x = i; 
    } 

    /** 
    * Called when object is recycled. 
    */ 
    @Override protected void finalize(){ 
     System.out.println("Finalizing..."); 
    } 

    /** 
    * Generates an object that is immediately abandoned. 
    * 
    * @param int i - An integer. 
    */ 
    public void generate(int i){ 
     MyClass o = new MyClass(i); 
    } 
} 

}

然而,當我嘗試編譯它,它顯示了以下錯誤:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    No enclosing instance of type GCDemo is accessible. Must qualify the allocation with an enclosing instance of type GCDemo (e.g. x.new A() where x is an instance of GCDemo). 

    at GCDemo.main(GCDemo.java:3) 

任何幫助嗎?謝謝!

+0

可能有[Java的重複 - 沒有可以訪問Foo類型的封閉實例](http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – fabian

回答

2

製作MyClass靜:

static class MyClass { 

沒有這一點,你必須有GCDemo一個實例,以實例MyClass。你沒有這樣的例子,因爲main()本身是static

+2

+1'main'在靜態上下文中,所以你不能假設有這樣一個實例。 –

0

你可以簡化你的例子很多。除了你一定會看到這個消息外,它會做同樣的事情。在你的例子中,GC可能無法運行,所以你可能看不到任何程序退出。

while(true) { 
    new Object() { 
    @Override protected void finalize(){ 
     System.out.println("Finalizing..."); 
    } 
    Thread.yield(); // to avoid hanging the computer. :| 
} 

基本問題是,你的嵌套類需要是靜態的。

+0

對不起,但是這段代碼掛起了我的電腦! –

+1

好吧,用一個良率嘗試一下。 –

+0

問題是,在屏幕上打印非常非常慢,但創建對象要快得多,這意味着您可以比清理對象更快地處理對象。 –