首页 > 试题广场 >

下列关于final、finally、finalize说法正确

[不定项选择题]
下列关于final、finally、finalize说法正确的是( )
  • final可以用来修饰类、方法、变量
  • finally是java保证重点代码一定要被执行的一种机制
  • 变量被final修饰后不能再指向其他对象,但可以重写
  • finalize设计的目的是保证对象在被垃圾收集前完成特定资源的回收
  1. final用于声明属性、方法和类:
    • final属性不可变,指的是引用不可变,而不关心指向对象内容的变化,被final修饰的变量必须初始化
    • final方法不可被子类重写,可以实现inline(内联)的机制
    • final类不可以被继承(如String、StringBuffer),所有的方法不可以被重写,但其内的非final变量可以被修改
  2. finaally作为异常处理的一部分,只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定被执行(特殊情况不会被执行,如try语句前出现异常或try语句块中出现的异常没有被捕获),经常被用在需要释放资源的情况下或是释放锁
  3. finalize是Object类的一个方法,在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收(一旦垃圾回收器准备好释放对象占用的空间,将首先调用该方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存),从功能上来说,finalize()方法与c++中的析构函数比较相似,但是Java采用的是基于垃圾回收器的自动内存管理机制,所以finalize()方法在本质上不同于C++中的析构函数。

关于finalize的补充!

判定一个对象objA是否可回收,至少要经历两次标记过程:

  • 如果对象objA到GC Roots没有引用链,则进行第一次标记。

  • 进行筛选,判断此对象是否有必要执行finalize()方法

    • 如果对象objA没有重写finalize()方法,或者finalize()方法已经被虚拟机调用过,则虚拟机视为“没有必要执行”,objA被判定为不可触及的。
    • 如果对象objA重写了finalize()方法,且还未执行过,那么objA会被插入到F-Queue队列中,由一个虚拟机自动创建的、低优先级的Finalizer线程触发其finalize()方法执行。
    • finalize()方法是对象逃脱死亡的最后机会,稍后GC会对F-Queue队列中的对象进行第二次标记。如果objA在finalize()方法中与引用链上的任何一个对象建立了联系,那么在第二次标记时,objA会被移出“即将回收”集合。之后,对象会再次出现没有引用存在的情况。在这个情况下,finalize方法不会被再次调用,对象会直接变成不可触及的状态,也就是说,一个对象的finalize方法只会被调用一次。
发表于 2020-09-14 16:10:42 回复(4)
当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
发表于 2019-07-18 10:07:00 回复(9)
发表于 2019-08-21 14:49:25 回复(4)
finalize应该是对象被回收前的一种拯救
发表于 2019-07-18 08:56:47 回复(0)
一、final关键字可以用来修饰类、方法、变量。各有不同。

A、修饰类(class)。 
     1、该类不能被继承。 
     2、类中的方法不会被覆盖,因此默认都是final的。 
     3、用途:设计类时,如果该类不需要有子类,不必要被扩展,类的实现细节不允许被改变,那么就设计成final类

B、修饰方法(method) 
     1、该方法可以被继承,但是不能被覆盖。 
     2、用途:一个类不允许子类覆盖该方法,则用final来修饰 
     3、好处:可以防止继承它的子类修改该方法的意义和实现;更为高效,编译器在遇到调用fianal方法转入内嵌机制,提高了执行效率。 
     4、注意:父类中的private成员方法不能被子类覆盖,因此,private方法默认是final型的(可以查看编译后的class文件)

C、修饰变量(variable) 
     1、用final修饰后变为常量。包括静态变量、实例变量和局部变量这三种。 
     2、特点:可以先声明,不给初值,这种叫做final空白。但是使用前必须被初始化。一旦被赋值,将不能再被改变。

D、修饰参数(arguments) 
     1、用final修饰参数时,可以读取该参数,但是不能对其作出修改

二、final关键字不能用来抽象类和接口
发表于 2019-11-12 23:15:17 回复(0)
变量被final修饰后不能再指向其他对象,只是引用地址不能改变,但是内容可以改变,重写不知道啥意思,内容重写的话我认为没错。
发表于 2020-07-21 20:23:44 回复(3)
finalize能完成特定资源的回收??jvm都不知道自己回收了哪些资源,finalize只是资源被回收之前最后的拯救。最多能把某些资源救活,哪里能完成特定资源的回收?
编辑于 2020-01-17 08:54:18 回复(2)
finalize()是Object的方法,子类可以覆盖该方法以实现资源清理工作的目的,GC会在回收对象之前调用该方法。可以理解为最后的”收尾“工作
编辑于 2019-10-22 09:53:21 回复(0)
牛圈红名大佬MC枫少之前沉迷于编程题,偶然回首发现选择题也比较有意思,就由MC枫少为您解答:
A和D肯定没的说,会点java基础的都知道,
针对B,持有保留意见,
正常情况下是可以的,fianlly不管是否有异常都会被执行
也会有不执行的情况:比如:
1.在try之前出现异常或者return时,try对应的finally中的内容不会被执行
2.finally之前虚拟机被停止,即使用System.exit(1)来退出虚拟机

发表于 2022-06-17 13:43:45 回复(0)
当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
发表于 2020-07-06 07:12:25 回复(0)
。。。。我下意识以为,final修饰对象,对象内容可以重写……
发表于 2019-09-06 15:51:53 回复(0)
final修饰的基本数据类型被赋值后不能被再次赋值
      修饰的引用数据类型指向的空间不可变,空间内容可变
      修饰的方法不可被重写
      修饰的类不能被继承
但你特么说“变量被重写?”
编辑于 2022-07-20 22:01:15 回复(0)
三者的区别
1、final:用于声明属性,方法,类。表示属性不可变,方法不可覆盖, 类不可被继承
2、finally:异常处理语句结构汇总,表示总是执行
3、finalize:Object类的一个方法,在垃圾回收机制中执行时,会调用被回收对象的方法。允许回收此前未回收的内存垃圾。
发表于 2019-12-28 10:13:35 回复(0)
被final修饰的:
1.类不可以被继承
2.方法不可以被重写
3.变量如果是基本类型不可改变;如果是引用类型,则引用指向不可变,但指向的内容可变
发表于 2022-06-15 18:01:25 回复(0)
被final修饰的类不可被继承,被final修饰的方法不可被重写,被final修饰的变量不可变
发表于 2022-05-11 09:38:23 回复(0)
1、final修饰符(关键字)
被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。
2、finally是在异常处理时提供finally块来执行任何清除操作
不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。
3、finalize是方法名
java技术允许使用finalize方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize方法以整理系统资源或者被执行其他清理工作。
发表于 2022-04-15 20:26:36 回复(0)
有没有哪位大佬解释一下C选项的重写是个什么意思?前半句说的是变量的不可变这是没问题的,后半句重写个人理解是说的内容的重写,内容是可以改变的。

编辑于 2022-04-11 08:14:23 回复(2)

关于final的重要知识点

  • final关键字可以用于成员变量、本地变量、方法以及类。
  • final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
  • 你不能够对final变量再次赋值。
  • 本地变量必须在声明时赋值。
  • 在匿名类中所有变量都必须是final变量。
  • final方法不能被重写。
  • final类不能被继承。
  • final关键字不同于finally关键字,后者用于异常处理。
  • final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
  • 接口中声明的所有变量本身是final的。
  • final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
  • final方法在编译阶段绑定,称为静态绑定(static binding)。
  • 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
  • 将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
  • 按照Java代码惯例,final变量就是常量,而且通常常量名要大写。
  • 对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。
    非本人手打引用自知乎
发表于 2022-03-19 15:39:05 回复(1)
finalize设计的目的是保证对象在被垃圾收集前完成特定资源的回收。
发表于 2021-03-16 14:05:02 回复(0)
被final修饰的类不能被继承
被final修饰的方法不能被重写
被final修饰的基本数据类型一旦被赋值,值就不能被改变
被final修饰的引用数据类型,该引用就不能再指向其他的对象(但该引用指向的实际对象的值/某个属性值是可以改变的)
道理我都懂,特么C选项后一句是啥JB意思啊,变量重写??????
ps:顺丰我俏丽吗
编辑于 2020-04-23 21:55:49 回复(1)