composition 中 finalize 的输出不确定
output of finalize in composition uncertain
为什么以下程序的输出 运行s 在 Course 的 finalize() 之前完成 Classmate ?
同学使用 class Course 对象,所以它的 finalize() 应该在 Course 的 finalize() 之后 运行?但输出显示 reverse.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
它这样做是为了给您(和任何其他 Java 程序员)一个教训。这个教训是:不要假设何时(或更好 if)调用 finalize。
说真的:您可以看看这个很棒的 question 并且会发现对 finalize 的调用绑定到垃圾收集器的操作。事情是:当垃圾收集器决定收集东西时,您绝对无法控制或 "insight"。大多数时候,它的活动将导致相同的结果......如果你不对你正在处理的 "setup" 进行更改。喜欢:运行 使用完全相同的 JVM 设置的完全相同的示例。但是,一旦您开始查看 "real world" 个应用程序……您将无时无刻不在遇到意想不到的惊喜。
哎呀 - 甚至不能保证 曾经 调用过 finalize。所以,你的代码不应该依赖它。因此,使用 finalize 的充分理由几乎为零。
换句话说:如果你真的想了解发生了什么;您将不得不深入研究您的 JVM 正在使用的 GC 的实现;了解 GC 定义垃圾的原因和时间;以及它何时开始收集垃圾。
为什么以下程序的输出 运行s 在 Course 的 finalize() 之前完成 Classmate ? 同学使用 class Course 对象,所以它的 finalize() 应该在 Course 的 finalize() 之后 运行?但输出显示 reverse.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
它这样做是为了给您(和任何其他 Java 程序员)一个教训。这个教训是:不要假设何时(或更好 if)调用 finalize。
说真的:您可以看看这个很棒的 question 并且会发现对 finalize 的调用绑定到垃圾收集器的操作。事情是:当垃圾收集器决定收集东西时,您绝对无法控制或 "insight"。大多数时候,它的活动将导致相同的结果......如果你不对你正在处理的 "setup" 进行更改。喜欢:运行 使用完全相同的 JVM 设置的完全相同的示例。但是,一旦您开始查看 "real world" 个应用程序……您将无时无刻不在遇到意想不到的惊喜。
哎呀 - 甚至不能保证 曾经 调用过 finalize。所以,你的代码不应该依赖它。因此,使用 finalize 的充分理由几乎为零。
换句话说:如果你真的想了解发生了什么;您将不得不深入研究您的 JVM 正在使用的 GC 的实现;了解 GC 定义垃圾的原因和时间;以及它何时开始收集垃圾。