浅谈java面试中final、finally、finalize 的区别!

 参加过面试的小伙伴想必都会遇到这个问题吧。反正我是参加过多次面试几乎每次面试都会遇到这个问题,今天我就来给大家整理一下,以备面试之需,文章内容来源网络参考和自己的总结,有不足之处还望见谅。新手上车,给点油吧。

        如果我们在面试的时候被问到三者的区别?首先我们就可以从语法和使用度简单介绍:

        final:用于修饰变量,方法,类。且修饰变量时,变量不可修改,修改方法时方法不能被重写,修饰类时,该类不能被继承。

修饰类

        当final修饰类的时候,表明该类不能被其他类所继承。但需要注意fianl类中的所有的成员方法都会隐式的定义为fianl方法。如图:

第一步:创建一个用final修饰的父类Father

第二步:创建一个子类Son继承Father

     我们看到了报警信息,点进去一看,意思就是类Son不能继承被final修饰的类Father,上面的结论得以印证。

修饰方法

    (1) 把方法锁定,以防止继承类对其进行更改。

  (2) 效率,在早期的java版本中,会将final方法转为内嵌调用。但若方法过于庞大,可能在性能上不会有多大提升。因此在最近版本中,不需要final方法进行这些优化了。

final方法意味着“最后的、最终的”含义,即此方法不能被重写。

注意:若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。

class A{
    private final void getName(){

    }
}

public class B extends A{
    public void getName(){

    }

    public static void main(String[]args){
        System.out.println("OK");
    }
}

 修饰变量

     final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。

(1)修饰变量

可以看到被final修饰的变量报错了,报错信息如下:

意为被final修饰的字段language没有被初始化,所以当变量被final修饰时要赋值初始化,如下:

(2)修饰类属性

类属性可以理解为一个将一个类作为另一个类的属性

第一步:先创建一个特征类

第二步:将特征类Feature设置为Son类的属性,并用final修饰

同样当类属性用final修饰时报错了,报错信息如下:

同样,报错信息为没有进行对final修饰的类进行初始化,下面看一下不用final修饰时是否报错:

很明显,答案是没有,那再来看一下当初始化Feature类后又会是怎样的?

finally: 属性:异常处理时的finally块 

作用:  try { 正常逻辑 } catch(Exception e) { 异常逻辑 } finally{ 一定会被执行的逻辑 }

用法:异常处理(try  catch)时finally块无论有没有异常发生,finally块的代码一定会被执行,所以在程序中有需要无论发生什么都必须执行的代码,就可以放在finally块中,最常见流关闭等释放资源的操作

注意:1.finally代码块无论有没有异常发生,finally块的代码一定会被执行;2.即使try里包含continue、break、return语句,try块结束后,finally块也会执行;3.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

finalize:

属性:方法名,Object中的方法

作用:finalize()方法是在垃圾收集器删除对象之前对这个对象调用

用法:Java中使用finalize()方法在垃圾收集器将对象从内存中清除出去之前(GC之前)做必要的清理内存的工作。这个方法是在垃圾收集器确认一个对象没有被引用时对这个对象调用的。它在Object类中定义的,所有的类都继承了它。子类覆盖finalize()方法已整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的

注意:1.垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法

2.程序退出时为每个对象调用一次finalize方法

3.当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用

4.finalize()方法被关键字protected修饰是防止在该类之外定义的代码访问finalize()标识符

5.finalize()方法的主要用途是释放一些其他做法开辟的内存空间,以及做一些清理工作   

6. 一旦垃圾回收器GC准备好释放对象占用的存储空间,首先会去调用finalize()方法进行一些必要的清理工作。只有到下一次再进行垃圾回收动作的时候,才会真正释放这个对象所占用的内存空间

7.finalize()现在已经不推荐使用了,java9已经设置为deprecated了

参考

https://www.liangzl.com/get-article-detail-6040.html

https://blog.csdn.net/lizheng1992123/article/details/83663036

https://time.geekbang.org/column/article/6906

  • 个人公众号,想学习的小伙伴记得点关注哦。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值