2016-06-28 13 views
1

다음 프로그램의 출력 결과가 Course of finalize() 전에 Classmate를 실행하는 이유는 무엇입니까? Classmate는 Course 클래스 객체를 사용하므로 Finalize()는 Course의 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); 
} 
} 

출력 :

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

그것은 그래서 당신 (그리고 다른 자바 프로그래머) 교훈을 가르치는 않습니다. 그 교훈은 다음과 같습니다.) finalize가 호출되는시기 (또는 더 좋은 경우 )에 대한 가정을하지 마십시오.

심각하게 :이 훌륭한 question을 확인할 수 있으며 finalize에 대한 호출이 가비지 수집기의 동작에 묶여 있음을 알 수 있습니다. 그리고 가비지 수집기가 물건을 수집하기로 결정할 때 절대 통제력이나 통찰력을 갖지 못합니다. 대부분의 경우, 그 활동은 당신이 다루는 "설정"을 변경하지 않으면 동일한 결과로 이어질 것입니다. 마찬가지로 : 매우 동일한 JVM 설정을 사용하여 동일한 예제를 실행합니다. 그러나 "실제"응용 프로그램을 보자 마자 당신은 예기치 않은 놀라움을 항상 경험하게 될 것입니다.

지옥 - 마무리가 인 경우이라고 불리는 경우조차도 보장되지 않습니다. 그래서, 당신의 코드는 그것에 의존해서는 안됩니다. 그래서, finalize를 전혀 사용하지 않는 좋은 이유가 있습니다.

다른 말로하면 : 실제로 무슨 일이 일어나고 있는지 알고 싶다면, 당신은 당신의 JVM이 사용하고있는 GC의 구현에 뛰어 들어야 할 것이다. 그 GC가 쓰레기를 정의하는 이유와시기를 이해합니다. 그리고 그 쓰레기를 모으기 시작할 때.