1.什么是final类?
Java中有一些类,如String,Math等,就是final类的典型例子。
虽然在Java编程中并不经常使用final类和final方法,但它们有着与众不同的特点,即final类不能被继承,不能被覆盖,以及final类在执行速度方面比一般类快。
2.为何不能继承final类?
有时需要对继承加以限制。
例如某些处理特殊运算和操作的类,为了安全理由,不允许被其他类所继承。final类没有子类,即它处于继承链的尾部(叶子类),或者除了自动继承Object之外,它们是独立存在的支持类,例如执行密码管理的类,处理数据库信息的管理类等等。
3.使用final类的另外一个理由是执行速度快。
由于它的方法不能够被覆盖,所以其地址引用和装载在编译期间完成,而不是在运行期间由JVM进行复杂的装载,因而简单和有效。所以如果没有必要,或者不存在有继承的可能性时,尽量使用final类。当然,在API类库中不多使用final类是因为它们是标准程序,希望在实际软件开发中得以广泛使用。
注意final数据和final类的不同。final数据指常量,即其值一旦初始化,就不能改变。而final类则指不能被其他类所继承的类。
4. 定义final类
在类名前加以关键字final,这个类就被定义为final类,如:
public final class SomeClass { 
    ... 
  
或者:
  
public final class SomeClass extends SuperClass { 
    ... 
}
当一个类被定义为final时,它的所有方法都自动成为final方法,但不影响对变量的定义。
5.不能覆盖final方法
我们可以在父类中设置某个方法为final方法。虽然这个类可以被继承,但子类不能够覆盖final方法。API类中的许多方法,如print()和println(),以及Math类中的所有方法都定义为final方法。在具体应用软件开发中,一些执行特殊性运算和操作的方法,可以定义为final方法。在方法的返回类型前加入关键字final,则定义该方法为final,如:
public final String printVersion() {        //定义final方法 
    return version; 
}
6.final参数
final参数的含义如同final变量一样,是常数参数,即当方法接受了这个参数后,其值不能改变。如下代码中定义方法的参数为final:
public void setVerison(final String version) {  //定义常量参数 
    this.version = version; 
  
在这个方法中使用如下语句产生语法错误: 
  
version = "other version…";                     //非法操作
7.final类为何能提高执行速度?
final类可以提高执行速度主要原因:
1.不涉及继承和覆盖。
2.其地址引用和装载在编译时完成。
3.在运行时不要求JVM执行因覆盖而产生的动态地址引用而花费时间和空间。
4.与继承链上的一般对象相比,垃圾回收器在收回final对象所占据的地址空间时也相对简单快捷。
但在某些情况下使用final方法并不能取得提高执行速度的结果。因为并不是所有final方法其地址的装载和引用在编译时间完成。
假设类C继承了B,B继承了A,在类A中有final方法。对类C来讲,调用A的final方法的确是inline编译,即装载在编译时间完成;但对A和B来讲,可能没有调用final方法。而在执行期间,JVM动态装载的方法有可能并不是C所调用的final方法。这种情况下,则不能够取得提高执行速度的结果。当然,如果final方法在编译时间装载到JVM,而且没有在执行期间覆盖的,可以取得inline效益,提高执行速度。

自己补充:

inline 机制:当在调用final方法的时候 直接将方法体插入到调用处 而不是进行方法的调用

final的其他知识点:

  1. final变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
  2. 在匿名类中所有变量都必须是final变量

出自:http://blog.sina.com.cn/s/blog_4b93170a0102e1z5.html

Java final类详解相关推荐

  1. Java Pattern类详解

    Java Pattern类详解 Pattern在java.util.regex包中,是正则表达式的编译表示形式,此类的实例是不可变的,可供多个并发线程安全使用. 定义 public final cla ...

  2. Java File类详解

    在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成.File 类定义了一些方法来操作文件,如新 ...

  3. Java Entry类详解

    Entry类概述 Java的entry是一个静态内部类,实现Map.Entry< K ,V> 这个接口,通过entry类可以构成一个单向链表. 一.java中Map及Map.Entry ( ...

  4. java Random类详解

    2019独角兽企业重金招聘Python工程师标准>>> Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起 ...

  5. java file类详解_Java File类详解及IO介绍及使用

    我是一个CPU:这个世界慢!死!了!,可以感受到CPU,内存和硬盘之间的速度比较. 文件的本质 OS(操作系统)的目的就是可以让上层程序可以通过一种统一的方式去拿到无论什么磁盘里的文件(即一段字节流) ...

  6. Java System类详解

    System 类位于 java.lang 包,代表当前 Java 程序的运行平台,系统级的很多属性和控制方法都放置在该类的内部.由于该类的构造方法是 private 的,所以无法创建该类的对象,也就是 ...

  7. Java Object类详解

    Object 是 Java 类库中的一个特殊类,也是所有类的父类.也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量.当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 O ...

  8. Java—File类详解及实践

    关注微信公众号:CodingTechWork,一起学习进步. File类介绍 File类概述   File类是java.io包下代表与平台无关的文件和目录.File可以新建.删除.重命名文件和目录,但 ...

  9. Java Scaner类详解_动力节点Java学院整理

    Java.util.Scanner是Java5.0的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都 ...

最新文章

  1. HDU 2087剪花布条 KMP
  2. python 并发访问数据库_【数据库】如何实现python3实现并发访问水平切分表
  3. @Html.Action()
  4. package-lock.json 文件的作用
  5. 【安装包】eclipseEE(IDE)
  6. XP访问windows 2003终端服务显示到期的解决
  7. 【多媒体封装格式详解】---MKV【2】
  8. 【语音处理】基于matlab GUI汉宁窗FIR陷波滤波器语音信号加噪去噪【含Matlab源码 1711期】
  9. Linux如何查找软件的安装位置
  10. sql server2000远程访问
  11. 经典情歌Lionel Richie李昂纳尔·里奇 - hello -say you say me
  12. 联想台式计算机亮度怎么调,Lenovo笔记本电脑如何调节屏幕亮度
  13. Linux中启动Steam报错libGL error的解决办法
  14. Unity 制造moba英雄联盟战争迷雾2
  15. 欠债还钱,天经地义(三)
  16. 软件测试 前置条件是什么意思,测试用例的前置条件
  17. 云计算前景如何?大专学历学习云计算怎么样?
  18. 找计算机研究的论文18个平台
  19. Linux-虚拟机ping不通主机
  20. OGNL表达式的基本用法

热门文章

  1. 【AI芯片CAISA】
  2. 地球兄弟版星球又出现了 Gliese 832 c系外行星
  3. Excel导入(注解)
  4. linux内核分析课程笔记(二)
  5. Linux挂载硬盘后无法进入系统,Centos7 fstab盘符挂载硬盘导致重启系统失败解决办法...
  6. 计算机的手机储存在哪里,手机的内存和电脑的内存、储存有哪些不同?
  7. Polygon zkEVM交易解析
  8. Java开发入门——三大平台的介绍
  9. 推荐一个好用的书摘软件
  10. 拼多多想制作出优质的主图?需了解这六点!