内容我之前写在BLOG里了,为了省事,就把BLOG的内容直接拷过来,大家看看吧。
在《JAVA编程思想》“4.3.3终结条件”一节中,作者想讨论的内容是finalize()的用法,为此举了一段代码为例。代码如下(注释行和测试代码省略):public class TerminationCondition{
public static void main(String args[]){
Book b1 = new Book(true);
b1.checkIn();
new Book(true);
System.gc();
}
}
class Book{
boolean checkedout = false;
public Book(boolean checkout){
checkedout = checkout;
}
public void checkIn(){
checkedout = false;
}
public void finalize(){
if(checkedout){
System.out.println("error:有文件未被签入");
}
}
}
作者在书中写到:所有的BOOK对象在被当作垃圾回收器前都应该被签入(check in),当在main方法中,由于程序员的错误,有一本书未被签入。要是没有finalize()来验证终结条件,将很难发现这种错误(《JAVA编程思想(第三版)第188页)我们来看这段代码,作者认为程序输出了"error:有文件未被签入",所以证明了finalize()的作用,但是我觉的用这段代码来证明作者的观点好象并不是很合适。我们能看到,代码Book novel = new Book(true)中,已经创建了对Book对象的引用,因此无论是否调用checkIn(),System.gc()语句都不会对该对象进行收集。我们可以把novel.checkIn()一行注释掉,运行时会发现,即使没有checkIn,程序仍然没有输出任何信息。
当然,我的意思并不是说作者的观点是错的,我只是觉的例子中关于novel的代码在证明作者观点上没有起到任何作用。
在《JAVA编程思想》“4.3.3终结条件”一节中,作者想讨论的内容是finalize()的用法,为此举了一段代码为例。代码如下(注释行和测试代码省略):public class TerminationCondition{
public static void main(String args[]){
Book b1 = new Book(true);
b1.checkIn();
new Book(true);
System.gc();
}
}
class Book{
boolean checkedout = false;
public Book(boolean checkout){
checkedout = checkout;
}
public void checkIn(){
checkedout = false;
}
public void finalize(){
if(checkedout){
System.out.println("error:有文件未被签入");
}
}
}
作者在书中写到:所有的BOOK对象在被当作垃圾回收器前都应该被签入(check in),当在main方法中,由于程序员的错误,有一本书未被签入。要是没有finalize()来验证终结条件,将很难发现这种错误(《JAVA编程思想(第三版)第188页)我们来看这段代码,作者认为程序输出了"error:有文件未被签入",所以证明了finalize()的作用,但是我觉的用这段代码来证明作者的观点好象并不是很合适。我们能看到,代码Book novel = new Book(true)中,已经创建了对Book对象的引用,因此无论是否调用checkIn(),System.gc()语句都不会对该对象进行收集。我们可以把novel.checkIn()一行注释掉,运行时会发现,即使没有checkIn,程序仍然没有输出任何信息。
当然,我的意思并不是说作者的观点是错的,我只是觉的例子中关于novel的代码在证明作者观点上没有起到任何作用。
另外,我不是姐姐……,我是男的,谢谢。
因为只有一个对象被回收了。
然后想回这个贴,就回了,有没有通常的挖矿一说啊,版主收下留情啊。