Final关键字、finally关键字、finalize关键字详解

  final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的。这里从final关键字在数据域、方法和类中三个方面分析final关键字的主要用法。

一、final概述

概念:由字面可以了解,final有最终态,无法改变的意思。

使用目的:为了阻止改变与提高效率。

高效原因:Java内嵌机制final方法会在编译的过程中利用内嵌机制进行inline优化。

  inline优化是指:在编译的时候直接调用方法代码替换,也就是内嵌,而不是在运行时调用方法。

  inline需要在编译的时候就知道最后要用哪个方法。

  然而,final方法可能在子类中被重写,由于可能出现多态的情况,编译器在编译阶段
并不能确定将来调用方法的对象的真正类型,也就无法确定到底调用哪个方法。)

修饰对象:

  1、非抽象类,由于被final修饰的类是不能被继承的,而抽象类必须被继承才有意义。

  2、非抽象方法,由于被final修饰的方法是不能被重写的,而抽象方法必须被重写才有意义。

  3、变量或常量。

注意:

  1、final不能修饰构造方法。

  2、父类的private方法是不能被子类重写的,因为private方法默认是final的。

 Final修饰参数或者变量(重点)

  说明:论属性是基本类型还是引用类型,final所起的作用都是变量里面存放的不能变。

1)基本数据类型

  1、对于基本数据类型final使数值恒定不变,是实实在在的的值,这与引用类型的不同

  2、一个既是static又是final的域只占据一段不能改变的存储空间。(public static final int VALUE)将数据定义为static强调只有一份,定义为final,则说明它是一个常量。

  3、Java允许声明为final但又未给定初值的域(空白final),但必须确保在使用前被初始化。(必须在域的定义[声明时,初始化块中]或者每个构造器初始化时对final进行赋值,但是只要初始化过,就无法再次赋值修改,否则编译报错)。

  4、在方法参数声明为final,意味着无法在方法中更改参数的值,但是可以读取该参数。(主要用来向匿名内部类传递数据)

2)引用类型

  1、引用类型变量里面放的是个地址,所以用final修饰引用类型变量指的是它里面的地址不能变,并不是说这个地址所指向的对象或数组的内容不可以变(内容值可以变)。

  例如:类中有一个属性是final Person p=new Person("name"); 那么你不能对p进行重新赋值,但是可以改变p里面属性的值p.setName('newName');

  其他方面与基本数据类型类似。

final方法

  1、使用final修饰方法时,可以把方法锁定,以防任何继承类修改它的含义。这是出于设计的考虑。(虽然不可以被继承,但是依然可以被子类调用,该父类方法不可以是private方法)

  2、方法被修饰为final时,就是同意编译器将针对该方法的所有调用都转换为内嵌调用。

  3、所有的private方法都隐式地指定为final的(但是子类是无法调用父类的private方法的)

final类

  1、当某个类整体定义为final时,就表明你不打算继承该类,而且也不允许别人这样做。(常见不可被继承的类,即final修饰的类,如:String类,Integer类,Math类等等,具体可以查看JAVA源码

 参考资料:

 https://blog.csdn.net/zhangliangzi/article/details/50604976

 https://blog.csdn.net/zq602316498/article/details/38762419

 二.Finally

如何使用:

  1.finallycatch语句一定会伴随try语句出现。

  2.try语句不能单独使用,必须配合catch语句或finally语句。
  3.try语句可以单独与catch语句一起使用,也可以单独与finally语句一起使用,当然也可以三者一起使用。

用途:

  1、 finally关键字用于try后面,finally块中的代码总是执行,不论是否发生异常。一般用于清理工作、关闭链接等类型的语句,如:文件流作为一种资源,在使用完毕之后要进行流的关闭,否则会造成资源的浪费的

注意:

  1try语句块里面有System.exit(0)这条代码,所以finally语句块里面的输出语句块是无效的,因为System.exit(0);执行会退出JVM,所以底下的代码是不会执行的

  (2)在执行return之前,会执行finally块中的程序。

 三、Finalize(待补充)

  finalizeObject类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收。

posted @ 2018-07-17 23:01  小码农成长记  阅读(317)  评论(0编辑  收藏  举报