首页 > 试题广场 >

final、finally和finalize的区别中,下述说

[不定项选择题]
final、finally和finalize的区别中,下述说法正确的有?
  • final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  • finally是异常处理语句结构的一部分,表示总是执行。
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件等。
  • 引用变量被final修饰之后,不能再指向其他对象,它指向的对象的内容也是不可变的。
选AB
A,D考的一个知识点,final修饰变量,变量的引用(也就是指向的地址)不可变,但是引用的内容可以变(地址中的内容可变)。
B,finally表示总是执行。但是其实finally也有不执行的时候,但是这个题不要扣字眼。
1. 在try中调用System.exit(0),强制退出了程序,finally块不执行。
2. 在进入try块前,出现了异常,finally块不执行。
C,finalize方法,这个选项错就错在,这个方法一个对象只能执行一次,只能在第一次进入被回收的队列,而且对象所属于的类重写了finalize方法才会被执行。第二次进入回收队列的时候,不会再执行其finalize方法,而是直接被二次标记,在下一次GC的时候被GC。
放一张图吧

编辑于 2018-07-16 21:52:12 回复(15)
🐴
发表于 2022-02-26 10:37:54 回复(0)
c错在最后一句
发表于 2021-02-15 18:07:51 回复(0)
不能关闭文件
发表于 2021-02-01 21:46:02 回复(0)
finalize不是用来关闭文件的,是回收垃圾对象。
编辑于 2019-09-16 15:50:10 回复(0)
C选项错在当对象被回收时finalized方法不一定会被调用,当对象没有重写finalized方法时被回收的时候可能就不调用finalized方法。(个人理解,欢迎讨论)
发表于 2019-07-19 12:51:40 回复(0)
C选项应该是不对的吧,当一个对象没有覆盖finalize方法时,虚拟机是不会调用该方法的;或者一个对象的finalize方法已经被调用过了,再次进行垃圾回收的时候就不会调用了。
发表于 2018-04-09 10:06:19 回复(0)
D错。使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
发表于 2015-02-01 22:46:43 回复(21)

一.final

如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在new一个对象时初始化(即只能在声明变量或构造器或代码块内初始化),而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能覆盖(重写)。

二.finally

在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

三.finalize

方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。注意:finalize不一定被jvm调用,只有当垃圾回收器要清除垃圾时才被调用。
发表于 2015-12-21 09:27:11 回复(9)
深入理解java虚拟机中说到:
当对象不可达后,仍需要两次标记才会被回收,首先垃圾收集器会先执行对象的finalize方法,但不保证会执行完毕(死循环或执行很缓慢的情况会被强行终止),此为第一次标记。第二次检查时,如果对象仍然不可达,才会执行回收。

应该算错啊,算对的话,误导大家。
发表于 2015-09-11 15:20:39 回复(10)
C 错,错在最后一句话:例如关闭文件。
finalize 并不是用来关闭文件的,关闭文件的操作由 一些 native 本地方法处理,finalize 只负责内存中垃圾对象的回收。
发表于 2018-03-03 09:36:41 回复(1)
// D错,引用变量被final修饰之后,不能再指向其他对象,但是它指向的对象的内容是不可变的。
final StringBuffer sb = new StringBuffer();
sb.append("hello");

//C错,
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,但是不是关闭文件这种操作而是一些通过调用了native方法产生的资源的释放.
发表于 2017-12-07 14:26:10 回复(4)
使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
假设一个final变量指向了一个学生类,final变量不能再更改指向教师类,但是学生类对象中可以修改名字,年龄等内容
发表于 2016-01-06 16:32:51 回复(2)
C的做法非常不建议,最好不要以任何方式使用finalize方法。
发表于 2015-03-29 10:45:25 回复(8)
B选项不严谨,当在finally之前执行System.exit()之后,finally就不会执行啦。
发表于 2016-04-14 09:51:00 回复(4)
一般不要使用finalize,最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。
编辑于 2016-04-12 08:35:02 回复(0)
回答这种问题真的很纠结和蛋疼~首先按牛客网的尿性他会玩文字游戏,其次,这种题目不严谨,比如B答案,总是执行么?我在try里写System.exit(0)你执行给我看看~这种不严谨的题目口头回答就好,别处选择题,意义不大
发表于 2017-08-31 08:52:15 回复(1)
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的敏感词资源的回收,例如关闭文件等。
发表于 2014-11-13 16:21:48 回复(1)
C选项:应该是在下一次回收~~
书上原话是“在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收,需要注意的是,一旦垃圾回收期准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生是,才会真正回收对象占用的内存。“
发表于 2018-08-15 10:32:04 回复(0)
final修饰变量,变量的引用(地址)不可变,引用的内容可以变
发表于 2022-04-07 23:59:06 回复(0)