首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不确定成分中的终形输出

不确定成分中的终形输出
EN

Stack Overflow用户
提问于 2016-06-28 12:33:01
回答 1查看 40关注 0票数 1

为什么下面程序的输出在完成()之前会运行同学的最终结果呢?同学使用类课程对象,所以它的finalize()当然应该在finalize()之后运行?但是输出显示的是reverse.WHY?

代码语言:javascript
复制
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);
}
}

产出:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-28 12:40:24

这样做是为了给您(和任何其他Java程序员)一个教训。这个教训是:不要假设何时(或者更好的,如果)被调用。

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

见鬼--甚至不能保证finalize是调用的。因此,您的代码不应该依赖它。因此,使用finalize的理由几乎为零。

换句话说:如果您真的想了解正在发生的事情;您必须深入了解JVM正在使用的GC的实现;了解该GC定义垃圾的原因和时间;以及它何时开始收集垃圾。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38076389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档