Java中final关键字的用法总结

 更新时间:2016年06月15日 10:12:17   作者:M_JCs  
在Java中,final可以别用来修饰类、修饰方法、修饰变量和修饰参数等,这里就来简单作一个Java中final关键字的用法总结:

1、final修饰类
被final修饰的类不能被继承,因此final类的成员方法也不能被覆写,被final关键字修饰的类没有子类,因此类的实现细节也无法改变,无法被扩展。final类中的所有成员方法都会被隐式地指定为final方法,final类中的成员变量可以根据需要设为final。

2、final修饰方法
一个类中的方法如果被final关键字修饰,则其子类无法覆写该方法,只能被子类继承。如果父类中的某个方法不想被其子类所覆写,可将该方法定义为final类型,另外,父类中的私有方法(即被private关键字修饰的方法)也不允许被子类所覆写,所以父类中被private关键字修饰的方法默认为final类型,被final关键字修饰的方法有如下特质:

该方法被锁定,可以防止任何继承类修改它的意义和实现;
高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率;
另外,使用final修饰的静态方法在其所属类的子类中不能被隐藏(hide);

3、final修饰变量
final这个关键字的含义是“这是无法改变的”或者“终态的”;
那么为什么要阻止改变呢?
java语言的发明者可能由于两个目的而阻止改变:
A.效率问题:
jdk中的某些类的某些方法,是不允许被用户覆盖的,设计者可能认为,所用方法已经是最好的方法,
 用户私自覆盖,或是由于疏忽而覆盖,就会影响JVM或是系统的系能;
B.设计所需:
众所周知,有些情况必须使用final关键字,比如方法中的匿名内部类的参数传递。
有人说final变量在赋值后就不可变,
那么这个不变到底指的是什么呢?
这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。
就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。
(1)被final关键字修饰的基本数据类型,则其数值一旦在初始化之后便不能更改;
(2)如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但该引用所指向的对象的内容是可以发生变化的。原因为:引用数据类型存储的引用对象在堆内存中的地址,final修饰引用类型之后,要求该引用指向的堆内存空间(或者说该引用存储的堆内存地址)不能改变。
当用final修饰类的非静态成员变量时,成员变量的初始化有两种方式:
(3)在声明时进行初始化
(4)在声明变量时可以不进行初始化,该变量被称为blank final,即final空白,但是要在这个变量所在的类的所有的构造方法中对这个变量赋初值。
当用final修饰类的静态成员变量时,静态成员变量的初始化方式也有两种:
(5)在声明时进行初始化
(6)在静态初始化块中进行初始化
当用final修饰接口的静态变量时,其初始化方式只有一种:
(7)在声明时进行初始化
当用final修饰局部成员变量时,只需要保证在使用之前被初始化赋值即可。
总之,被final关键字修饰的变量在声明时可以不进行初始化,但必须保证该变量在使用之前被初始化,一旦被初始化赋值之后,就不能再被重新赋值了。试分析一下程序的输出结果:

public class Test {
 public static void main(String[] args) {
   String a = "hello2"; 
   final String b = "hello";
   String d = "hello";
   String c = b + 2; 
   String e = d + 2;
   System.out.println((a == c));
   System.out.println((a == e));
 }
}

4、final修饰参数
当方法参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。该变量在方法调用时被创建,同时初始化为对应实参值,在方法体(body)执行结束前,其值不能改变。用final关键字修饰的基本数据类型的参数,其参数值无法改变,用final关键字修饰的引用数据类型,无法是该引用指向其他对象或再次赋值为null,但可以使用该引用改变引用对象的内容。final用于修饰参数的目的并非防止在调用的方法内部对参数的操作改变方法外部对应变量的值,只是防止在该方法内对该参数进行重新赋值操作,影响该参数传递时的初始值。而且将方法中的参数用final关键字修饰并不能防止从方法外部所传递的参数的值的内容不被改变。具体可参考final修饰引用数据类型的解释。

相关文章

  • Maven scala和java混合打包方式

    Maven scala和java混合打包方式

    这篇文章主要介绍了Maven scala和java混合打包方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • hutool 工具类基本使用教程

    hutool 工具类基本使用教程

    Hutool 是一个 Java 工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让 Java 语言也可以 “甜甜的”,下面通过本文学习下hutool 工具类基本使用教程,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • 基于JVM 中常见垃圾收集算法介绍

    基于JVM 中常见垃圾收集算法介绍

    下面小编就为大家分享一篇基于JVM 中常见垃圾收集算法介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 解决springboot 连接 mysql 时报错 using password: NO的方案

    解决springboot 连接 mysql 时报错 using password: NO的方案

    在本篇文章里小编给大家整理了关于解决springboot 连接 mysql 时报错 using password: NO的方案,有需要的朋友们可以学习下。
    2020-01-01
  • Java动态规划篇之线性DP的示例详解

    Java动态规划篇之线性DP的示例详解

    这篇文章主要通过几个例题为大家详细介绍一些Java动态规划中的线性DP,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-11-11
  • Java批量修改文件名的实例代码

    Java批量修改文件名的实例代码

    几天前在163公开课上下了一些mp4视频文件。发现课程名和文件名不对应,想到编个程序批量修改。先分析网页源代码将课程名和文件名一一对应,存储在一个文件里,然后使用Java读取该文件进而修改文件名。
    2013-04-04
  • java类的定义与使用举例详解

    java类的定义与使用举例详解

    这篇文章主要给大家介绍了关于java类的定义与使用的相关资料,类的方法是用来定义类的行为,在方法中通过操作类的成员变量、编写业务逻辑、返回 结果等实现类的业务行为,需要的朋友可以参考下
    2023-11-11
  • java8 stream 操作map根据key或者value排序的实现

    java8 stream 操作map根据key或者value排序的实现

    这篇文章主要介绍了java8 stream 操作map根据key或者value排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 使用Java注解模拟spring ioc容器过程解析

    使用Java注解模拟spring ioc容器过程解析

    这篇文章主要介绍了使用Java注解模拟spring ioc容器过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Seata AT模式TransactionHook被删除探究

    Seata AT模式TransactionHook被删除探究

    这篇文章主要为大家介绍了Seata AT模式TransactionHook被删除探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论