class Dog
{
boolean bo = false;
Dog (boolean al)
{
bo = al;
System.out.println(bo+"1");
}
void bx()
{
bo = true;
System.out.println(bo+"2");
}
void xt()
{
bo = false;
System.out.println(bo+"3");
}
protected void finalize()
{
if(bo)
{
System.out.println(bo+"4");
}
else 
System.out.println(bo+"5");
}

}
class Test1
{
public static void main(String[] args)
{
Dog d = new Dog(true);
d.xt();
new Dog(true);
System.gc();
}
}这个程序,为啥在main方法里一定要再new一个新对象,才会执行protected void finalize() 这一步呀?
然后,如果System.gc(); 这个语句注释掉,为啥也是执行不了protected void finalize() 这一步呢?
这里看不懂,求教大佬们~

解决方案 »

  1.   

    从main方法第一行开始,第一行申请一个堆空间初始化并将地址赋值给栈空间的引用类型变量d,第三行只是申请一个堆空间并初始化,没有任何引用类型变量指向它,然后第四行提醒虚拟机进行垃圾回收此时只会第三行的堆空间,然后调用该对象的回收方法,你把前两行去掉也是一样的。详情百度java强引用,弱引用,虚引用等等会有详细的解释
      

  2.   

    因为Dog d = new Dog(true);
    是程序的变量,程序没结束不是垃圾,
    而new Dog(true);是一次引用,用完就是垃圾了
    所以当System.gc();执行时,只有new Dog(true);被认为是垃圾而回收。
      

  3.   

    静态方法不能调用非静态方法,你在finalize方法上加上static就可以了
    protected static void finalize()