码迷,mamicode.com
首页 > 编程语言 > 详细

Java核心技术36讲----------谈谈final、finally、finalize有什么不同

时间:2019-01-29 18:26:17      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:更改   初始   性能提升   nal   实现   com   属性   static   with   

一、final

1.final修饰方法时,需要注意的点:

  #final修饰方法时,之前的第二个原因是效率。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“

  #因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。即父类的final方法是不能被子类所覆盖的,也就是说子类是不能够存在和父类一模一样的方法的

  #要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。(注:类的private方法会隐式地被指定为final方法。),参考如下代码:

public class B extends A {

    public static void main(String[] args) {

    }

    public void getName() {
        
    }
}

class A {

    /**
     * 因为private修饰,子类中不能继承到此方法,因此,子类中的getName方法是重新定义的、
     * 属于子类本身的方法,编译正常
     */
    private final void getName() {
        
    }

    /* 因为pblic修饰,子类可以继承到此方法,导致重写了父类的final方法,编译出错
    public final void getName() {
    
    }
    */
}

2.修饰变量时需要注意点

  #  final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

  # 如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

  # final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式

  # 当函数的参数类型声明为final时,说明该参数是只读型的。即你可以读取使用该参数,但是无法改变该参数的值。

  # 掌握点:类的final变量和普通变量有什么区别?见参考链接

    * 优化问题:编译时和运行时获取final的修饰的值

  # 掌握点:被final修饰的引用变量指向的对象内容可变吗?

    *changeValue方法中的参数i用final修饰之后,就不能在方法中更改变量i的值了。

    *值传递问题

参考:https://www.cnblogs.com/xiaoxi/p/6392154.html    http://tryenough.com/javabase#

 

二、finally

  

  # 需要关闭的连接等资源,更推荐使用Java7中添加的try-with-resources语句,因为通常Java平台能够更好地处理异常情况,编码也要少很少

  # 当一个外部资源的句柄对象实现了AutoCloseable接口,JDK7中便可以利用try-with-resource语法更优雅的关闭资源,消除板式代码。

  # try-with-resource时,如果对外部资源的处理和对外部资源的关闭均遭遇了异常,“关闭异常”将被抑制,“处理异常”将被抛出,但“关闭异常”并没有丢失,而是存放在“处理异常”的被抑制的异常列表中。

 

参考连接:https://www.cnblogs.com/itZhy/p/7636615.html     https://www.cnblogs.com/hihtml5/p/6505317.html

 

 

三、finalize

  # finilize被设计成在对象被垃圾收集前调用,这意味着实现了finalize方法的对象是个“特殊公民”,finlize的执行是和垃圾收集关联在一起的,一旦实现了非空的finalize方法,就会导致相应对象回收呈现数量级上的变慢。finalize本质上成为了快速回收的阻碍者

  # 不要让finalize去承担资源释放的主要职责,最多让finalize作为最后的“守门员”。所以,推荐资源用完即显式释放,或者利用资源池来尽量重用

  # java平台目前在逐步使用java.lang.ref.Cleaner来替换掉原来的finalize实现,Cleaner的实现利用了幻象引用。但同样不能完全依赖Cleaner进行资源回收,防止幻象引用堆积

 

Java核心技术36讲----------谈谈final、finally、finalize有什么不同

标签:更改   初始   性能提升   nal   实现   com   属性   static   with   

原文地址:https://www.cnblogs.com/developmental-t-xxg/p/10333940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!