2016-06-28 46 views
1

爲什麼以下程序的輸出在定稿()之前跑Classmate運行結束? Classmate使用課程對象,因此它的finalize()應該在課程的finalize()之後運行?但輸出顯示反向.WHY?輸出定稿在構圖不確定

class Classmate{ 

    Course mca; 
    Classmate(){ 
     System.out.println("Student const. `enter code here`called"); 
     mca = new Course(); 
     mca.getCourse(); 
    } 

    @Override 
    protected void finalize() {System.out.println("good bye Student"); 

    } 
} 
class Course{ 
    Course(){ 
     System.out.println("Course const. called"); 
    } 

    void getCourse(){ 
     System.out.println("your ccourse is MCA"); 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     // TODO Auto-generated method stub 
    System.out.println("goodbye course"); 
    } 
} 



public class Composition { 

public static void main(String[] args) { 

    Classmate ram = new Classmate(); 
    ram=null; 
    System.gc(); 
    for(int i=0;i<5;i++) 
     System.out.println("i is "+i); 
} 
} 

OUTPUT:

Student const. called 

Course const. called 

your ccourse is MCA 

good bye Student 

i is 0 

goodbye course 

i is 1 

i is 2 

i is 3 

i is 4 
+0

輸出學生用於代替Classmate –

回答

0

它這樣做教你(以及任何其他Java程序員)的教訓。該課程是:不要對什麼時候(或更好的,如果)完成調用進行假設。

說真的:你可以看看這個偉大的question,並且會發現調用finalize會綁定到垃圾回收器的動作。事情是:當垃圾回收商決定收集材料時,你完全沒有控制權或「洞察力」。大多數情況下,它的活動將導致相同的結果...如果你不改變你正在處理的「設置」。就像:使用相同的JVM設置運行相同的示例。但只要你開始看「真實世界」的應用程序......你會一直遇到意想不到的驚喜。

赫克 - 它甚至沒有保證,最終確定是有史以來調用。所以,你的代碼不應該依賴它。所以,根本沒有理由使用finalize。

換句話說:如果你真的想了解正在發生的事情;您將不得不深入到您的JVM正在使用的GC的實現中;瞭解GC爲什麼以及何時定義垃圾;當它開始收集垃圾時。