先看代码public class ttt { ttt() {
finalize(); } public void str() {
System.out.print("123");
} protected void finalize() {
System.out.print("456");
} public static void main(String[] args) {
// TODO 自动生成方法存根
ttt t=new ttt();
t.str();
}}问一下  既然finalize 是回收内存  问什么  t.str还能运行啊  而且能在构造还输里面运行啊  是不是ttt还在运行 内存回收不了啊     小弟不太明白啊    分数比较少大家谅解啊  呵呵

解决方案 »

  1.   

    回收内存是JVM的事,即使你调用了finalize函数,也不一定保证立马就能得到执行。
    你只能建议JVM来回收,但不能强迫它来回收。
      

  2.   

    finalize是回收内存之前调用的一个方法
    并不是你主动调用了finalize方法,就会回收内存
    什么时候回收内存是不确定
      

  3.   

    java中的垃圾回收是你控制不了的,你可以调用finalize来进行垃圾回收,但它不保证会立即执行,只有jvm觉得要执行了才会执行,因为垃圾回收的开销比较大,所以它的优先级比较低,在必要的时候才会执行它,而不是你想让它回收它就回收
      

  4.   

    1.finalize这个方法的作用并不是回收内存,一般而言垃圾回收时JVM控制的,但是jvm回收垃圾之前会调用到finalize这个方法,这就允许你在垃圾回收之前做一些准备工作写在finalize里面。
    2.finalize本身作为一个方法是可以在任何可见的地方运行的。
    3.一般情况下垃圾回收是jvm做的,但并不绝对,所以上面说的并不全面,程序里面调用System.gc()还是可以手动回收的。
      

  5.   

    heixia2025说的大体正确,但调用System.gc()也并不能保证垃圾回收的执行。
      

  6.   

    用户是不能回收对象的,但是可以运行垃圾回收前的方法finalize()
      

  7.   

    finalize这个方法的作用并不是回收内存,一般而言垃圾回收时JVM控制的,但是jvm回收垃圾之前会调用到finalize这个方法,这就允许你在垃圾回收之前做一些准备工作写在finalize里面。