2016-06-28 8 views
1

なぜ、次のプログラムの出力がコースのfinalize()の前にクラスメイトのファイナライズを実行するのですか? ClassmateはCourseクラスオブジェクトを使用しているため、Finalize()はCourseのfinalize()の後に実行する必要がありますか?しかし、出力は逆を示しています。合成のファイナライズの出力が不確定です

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

出力クラスのクラスメイトの代わりに使用されます –

答えて

0

それはとてもあなた(およびその他のJavaプログラマ)レッスンを教えることはありません。そのレッスンは、finalizeがいつ呼び出されるか(あるいはの場合はの場合)を前提にしないでください。

真剣に:あなたはこの偉大なquestionをチェックアウトすることができます。ファイナライズの呼び出しは、ガベージコレクタの動作に拘束されています。そして、事は:ガベージコレクタが物事を収集することを決定するとき、あなたは絶対にコントロールや "洞察"を持っていません。ほとんどの場合、その活動は同じ結果につながります...あなたが対処している "設定"に変更を加えない場合。同様の例:非常に同じJVM設定を使用して同じ例を実行する。しかし、「現実の」アプリケーションを見てみるとすぐに、あなたは予期せぬ驚きを常に経験します。

ヘック - ファイナンスがで、これまでにと呼ばれていることさえ保証されていません。だから、あなたのコードはそれに頼るべきではありません。したがって、ファイナライズを使用する正当な理由はまったくありません。

つまり、実際に何が起こっているかを理解したい場合は、 JVMが使用しているGCの実装に飛び込む必要があります。なぜそのGCがゴミを定義しているのかを理解する。それがゴミの収集を開始するとき。

関連する問題