为了账号安全,请及时绑定邮箱和手机立即绑定

如下代码“将很难发现这种缺陷,这是怎么回事”什么意思?

如下代码“将很难发现这种缺陷,这是怎么回事”什么意思?

繁星淼淼 2022-07-21 15:11:59
//: initialization/TerminationCondition.java// Using finalize() to detect an object that// hasn't been properly cleaned up.class Book {boolean checkedOut = false;Book(boolean checkOut) {checkedOut = checkOut;}void checkIn() {checkedOut = false;}protected void finalize() {if(checkedOut)System.out.println("Error: checked out");// Normally, you'll also do this:// super.finalize(); // Call the base-class version}}public class TerminationCondition {public static void main(String[] args) {Book novel = new Book(true);// Proper cleanup:novel.checkIn();// Drop the reference, forget to clean up:new Book(true);// Force garbage collection & finalization:System.gc();}} /* Output:Error: checked out*///:~问题1:输出为什么是“Error: checked out”,在哪里调用了finalize()方法,(因为只有finalize()方法里有打印输出语句System.out.println("Error: checked out");)问题2:书上说,在main()方法里,由于错误,有一本书(即Book对象)为被check in, 要是没有finalize()来验证终结条件,见很难发现这种缺陷,真是怎么回事问题3:main()方法是不是调用了两次构造方法,第一次“Book novel = new Book(true);”,第二次new Book(true);问题2:应该是“将很难发现这种缺陷,这是怎么回事”
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

system.gc()应该是垃圾回收函数,就是不用的东西就把它收回去,清理出空间来!但是java中的垃圾是自动回收的,它是根据什么来判断要不要把这个变量或对象当作垃圾回收呢?就是根据一个指针,就是说这个变量或对象系统内没有指针指向他了,就是你再想要用这个变量或对象的时候,系统没有办法找到它了,这样就会把他当作垃圾自动回收!就比如说 例子中的 new Book(true);定义的一个无名称的book对象,这个Book 对象他是存在内存里的,但是你能够找到它并且引用它吗?很明显不可以(因为你找不到一个变量指针指向他,所以无法应用呢)。这时候系统就会把它当垃圾回收掉,这就是java 的回收机制!
问题一:
在system.gc()这个调用时,就把你用new Book(true)定义的无名对象给回收了,但是finalize()这个函数要在这个对象“挂掉”之前执行一下!

问题二:
你的问题我也不知道问的是什么,但是根据我的理解
他说的应该是“这个程序调用system.gc的原意是要回收Novel这个book对象的,但是系统的默认回收了却是用new Book(true)定义的无名对象,这样就达不到原来的意图,万一这个对象占用内存很夸张就会导致“头疼的后果”, 所以他建议每个人在写程序的时候最好加finalize()这个函数,确认下到底有没有回收了自己想要回收的东西,从而保证程序的安全性”

问题三:
是调用了两次构造函数,第二次好像不像对吧,它和第一种用法是一样的,只不过是定义了一个没有名字的对象而已

我不知道这个讲的对不对哦,不经常用都忘记了,呵呵,祝你找到一更满意的答案

查看完整回答
反对 回复 2022-07-24
?
忽然笑

TA贡献1806条经验 获得超5个赞

问题1:
finalize()方法是object类中的方法,此方法将在对象被销毁的时候调用,被系统认为是垃圾的对象是没有引用的 既 Book b = new Book();当执行b=null;时,该对象没有任何引用指向它,被系统判断为垃圾,垃圾回收机制是系统自己运行的,但也可手动调用既 System.gc()
问题2:
finalize()方法一般用来释放资源,释放被自己所引用的对象,好让垃圾回收器将没用的对象回收,例如打开了一个文件,当此对象将被销毁的时候就一定要判断是否该文件是否被关闭,否则很容易内存溢出,导致程序崩溃
问题3:
确实调用了辆次构造 第一次有引用指向被新构造出来的对象,第二次没有引用指向它,所以调用System.gc()的时候该对象被销毁,销毁前调用了 finalize()方法打印了那句话


查看完整回答
反对 回复 2022-07-24
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

1.System.gc();时调用finalize()方法,你去看下JAVA垃圾回收机制就明白了.你可以将这句注释掉,然后运行看看;
2.在这段程序中第2次new Book(true);未被checkIn,会输出Error: checked out ,如果没有finalize()来验证,你就不知道第2次的new Book(true);未被checkIn,这就是缺陷。
3.是。

查看完整回答
反对 回复 2022-07-24
  • 3 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号