2017-04-21 46 views
0

我在写程序,所以我遇到了问题。Java - finalize()不叫

为什么finalize()方法不被调用?

public class ExOne extends Thread { 
    private String sD; 
    ExOne(String startUp, String shutDown){ 
     System.out.println("Start-up message is: " + startUp); 
     sD = shutDown; 
    } 
    public void finalize() { 
     System.out.println("Shut-down message is: " + sD); 
    } 
    @Override 
    public void run() { 
     try { 
      for (int i = 0; i < 3; i++) { 
       System.out.println("Message " + String.valueOf(i)); 
       Thread.sleep(1000); 
      } 
     } 
     catch (InterruptedException e){ 
      System.out.println(e); 
     } 
     System.gc(); 
     System.runFinalization(); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     ExOne exOneobj = new ExOne("start", "stop"); 
     exOneobj.start(); 
    } 
} 

所以输入:

Start-up message is: start 
Message 0 
Message 1 
Message 2 

Process finished with exit code 0 

而且没有消息 “具备停机的消息是停止”。 请帮帮我。

出了什么问题?

+2

你的程序中没有任何'exOneobj'超出范围,所以它永远不会被垃圾收集,所以'finalize()'永远不会运行。 – azurefrog

+0

''finalize()'是在垃圾收集对象('exOneobj')释放内存空间之前执行的,但是在你的程序中当'run'退出时'exOneobj'仍然在内存中,但程序结束以至于finalize()不叫 –

回答

0

finalize()当对象被垃圾回收器清除时执行,在你的情况下它从来没有发生,因为程序结束之前exOneobj有机会被清除。