内容提要:
• finally和finalize语法点和面试说辞
• final可以作用在类、方法和属性上
• 话题涉及到内存回收和面向对象设计,面试时该如何引出
finally从句的说辞(复习):
• 不管是否发生异常,不管发生何种异常,finally从句代码都会被执行
• 哪怕try和catch里有return,finally从句也会被执行
• 除非有System.exit(0)语句,finally从句才不会被执行 (项目里用到System.exit(0)的地方很少)
• 画龙点睛:finally从句里,可以存放回收资源的代码,比如释放数据库连接, 释放IO对象, 清空(clear)集合,设置大对象为 null,以减少大对象上的强引用,从而提升大对象的回收时间
finalize方法的用途:
• 相当于C++里的析构函数,对象被回收前,会调用该方法 ;
• 建议不重写,采用Object类里默认的,即不做任何动作;
• 如果要重写,千万慎重,因为一旦没写好,会导致对象无法被 回收,从而导致内存泄漏 ;
• 你有没有重写finalize方法?有些不知轻重的候选人会说重写过 ,但无法说出如何重写,为什么要重写。
• 建议说辞:我知道finalize的作用,为了避免因错写而导致的对象无法回收,所以在项目里不重写
final作用在类上
• 可以作用在类上,表示这个类不能被继承
• final类的方法,会隐式地设置为final,即不可被覆盖
• 在详细设计阶段,如果有不想被继承的类,比如业务订单类, 那么需要在类上加上final修饰
final作用在方法上
• 可以作用在方法上,表示该方法无法被覆盖
• 定义final方法的动机是,防止子类方法通过覆盖修改其中逻辑
• 在详细设计阶段,如果在父类里定义的方法已经定型,而如果 在子类里修改它会有逻辑错,那么可以加上final修饰
final作用在变量上
• 如果作用在基本数据类型上,该变量不能被修改,即为常量
• 如果作用在引用上,该引用不能再指向其它内存空间,但该引 用指向的当前值,是可以改变的
• 在实际项目里,一般是用final来定义常量
在面试中引出相关话题的技巧
• 在详细设计和代码Review的过程,我们会根据业务需求,在相关类和方法前加final,然后展开
• 我们的项目非常注意异常处理流程,比如在finally从句里加入资 源回收类代码,然后展开
• 在我们项目里,因为无需在对象回收前定义相关资源释放的动 作,所以无需重写finalize方法,并且要确保所有类的该方法都 不重写
总结
1. final,finally和finalize的语法 2. 如果没有特殊需求,不要重写finalize方法