Java 组合中的finalize输出不确定

Java 组合中的finalize输出不确定,java,garbage-collection,composition,garbage,finalize,Java,Garbage Collection,Composition,Garbage,Finalize,当然,为什么下面程序的输出在finalize()之前运行同学的finalize? Classmate使用类Course对象,因此它的finalize()应该在finalize()之后运行,当然了?但结果却恰恰相反。为什么 class Classmate{ Course mca; Classmate(){ System.out.println("Student const. `enter code here`called"); mca = new

当然,为什么下面程序的输出在finalize()之前运行同学的finalize? Classmate使用类Course对象,因此它的finalize()应该在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);
}
}
它这样做是为了给您(和任何其他Java程序员)上一课。这一教训是:不要对何时调用finalize(或者如果调用finalize更好)

认真地说:您可以查看这篇文章,并会发现finalize调用与垃圾收集器的操作绑定在一起。问题是:当垃圾收集器决定收集东西时,你绝对没有控制权或“洞察力”。大多数情况下,它的活动将导致相同的结果。。。如果您不更改正在处理的“设置”。比如:使用完全相同的JVM设置运行完全相同的示例。但一旦你开始研究“真实世界”的应用程序。。。你总是会遇到意想不到的惊喜

见鬼-甚至不能保证finalize被调用过。因此,您的代码不应该依赖它。因此,使用finalize几乎没有什么好的理由

换句话说:如果你真的想了解发生了什么;您必须深入了解JVM正在使用的GC的实现;理解GC定义垃圾的原因和时间;当它开始收集垃圾时。

它这样做是为了给你(和任何其他Java程序员)一个教训。这一教训是:不要对何时调用finalize(或者如果调用finalize更好)

认真地说:您可以查看这篇文章,并会发现finalize调用与垃圾收集器的操作绑定在一起。问题是:当垃圾收集器决定收集东西时,你绝对没有控制权或“洞察力”。大多数情况下,它的活动将导致相同的结果。。。如果您不更改正在处理的“设置”。比如:使用完全相同的JVM设置运行完全相同的示例。但一旦你开始研究“真实世界”的应用程序。。。你总是会遇到意想不到的惊喜

见鬼-甚至不能保证finalize被调用过。因此,您的代码不应该依赖它。因此,使用finalize几乎没有什么好的理由


换句话说:如果你真的想了解发生了什么;您必须深入了解JVM正在使用的GC的实现;理解GC定义垃圾的原因和时间;当它开始收集垃圾时。

在输出中,学生被用来代替同学在输出中,学生被用来代替同学
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