内容我之前写在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的代码在证明作者观点上没有起到任何作用。

解决方案 »

  1. Book   novel   =   new   Book(true)在哪儿呢?没见着~
      

  2. 回复2楼,在练习代码的时候我自己做了一下修改,用b1代替了书中所写的novel了。
      

  3. 姐姐,你的代码有问题。String args[]是什么玩意?
      

  4. 大多数代码都会写成String[] args,但是我是以前写代码时就留下的习惯,喜欢写成String args[]。
    另外,我不是姐姐……,我是男的,谢谢。
      

  5. 《think in java》里面有这样一句话:如果JVM的内存没有耗尽,JAVA就不会浪费时间去回收内存。内存回收的时候,将回收没有引用的对象,你创建的第一个对象是有引用的,不会被回收,第二个对象会被回收。作者用两个对象,来说明java内存回收的原则,我觉得还是比较恰当的啊。所以你的程序会输出一次:error:有文件未被签入
    因为只有一个对象被回收了。
      

  6. 哎呀,不好意思,我是为了学习finalize(),直接在论坛搜索的finalize关键字,没看帖子的时间。
    然后想回这个贴,就回了,有没有通常的挖矿一说啊,版主收下留情啊。
      

类似问题 »