简单看了一下异常处理的课件,感觉内容还是可以的,不过少了自定义异常的知识,所以决定把自定义异常内容加入进去;当看到finally关键字的时候,想起年轻的时候找工作,经常被问到finally、final、与finalize之间的区别。
finally和final都给介绍了,所以这里简单说一下finalize。
说道finalize这个关键字就要说道java的垃圾回收机制。
在C++处理某实体时,当应用不需要某实体时,就需要调用delete关键字来告诉系统,我不需要这块空间了,对于C++程序员来说,需要手动调用,所以是一个很麻烦很难做的事情,经常会看到一些技术网站昏天暗地地讨论C++内存泄漏的话题,有些时候讨论的激烈了,怕是只要见面就会动手了。
在Java中程序员完全不用考虑实体销毁,也就是只需要考虑实体声明,具体如何销毁实体是JVM要做的工作。
JVM的垃圾回收机制是实时监控堆内存,当发现某些实体没有引用时就会把这些实体放入垃圾回收列表中,但这些放入回收列表中的实体并不是马上被销毁,具体何时被销毁,那就是JVM的垃圾回收算法做的处理了。
但是很多人还是不放心垃圾回收,所以想要自己控制Java的垃圾回收,在这里我要告诉你这是不可能的;但是你可以做一些处理,告诉JVM需要做垃圾回收了,让JVM提前做垃圾回收处理,或者可以说让JVM清理垃圾更容易发生。有两种方法可以实现以上需求,第一种是把堆内存中的引用变量移除,相当于告诉JVM我已经不用这个实体了;第二种是调用System.gc();调用这个方法后同样可以让JVM更容易发生垃圾回收。
那这些和finalize有什么关系呢,在垃圾回收后,会自动调用finalize()方法,注意,这个方法是Object中的方法,所以任何实体类都可以调用这个方法,finalize()方法被称作是垃圾回收的善后方法。看如下例子。
public
class T2 {
private String
name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name =
name;
}
public T2(String name)
{
this.name =
name;
}
public
static void main(String[] args){
for(int i = 0 ; i< 100; i++){
new T2("T"+i);
}
System.gc();//让JVM更容易发生垃圾回收
}
//重写垃圾回收善后的方法
public void
finalize(){
System.out.println(this.getName());
}
}
运行时会看到效果,如果去掉System.gc();这句话,几乎看不到任何效果
通过垃圾回收是不是对finalize有了进一步的了解?