初始化和清理问题,求教大佬~

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() 这一步呢?
这里看不懂,求教大佬们~
...全文
118 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-07-22
  • 打赏
  • 举报
回复
因为Dog d = new Dog(true);
是程序的变量,程序没结束不是垃圾,
而new Dog(true);是一次引用,用完就是垃圾了
所以当System.gc();执行时,只有new Dog(true);被认为是垃圾而回收。
Super沙码龙 2019-07-22
  • 打赏
  • 举报
回复
静态方法不能调用非静态方法,你在finalize方法上加上static就可以了 protected static void finalize()
心怀啊 2019-07-21
  • 打赏
  • 举报
回复
从main方法第一行开始,第一行申请一个堆空间初始化并将地址赋值给栈空间的引用类型变量d,第三行只是申请一个堆空间并初始化,没有任何引用类型变量指向它,然后第四行提醒虚拟机进行垃圾回收此时只会第三行的堆空间,然后调用该对象的回收方法,你把前两行去掉也是一样的。详情百度java强引用,弱引用,虚引用等等会有详细的解释

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧