final修饰的实例变量

被final修饰的实例变量必须显示指定初始值,而且只能在如下3个位置指定初始值:
1.定义final实例变量时指定初始值;
2.在非静态初始化块中为final实例变量指定初始值
3.在构造器中为final实例变量指定初始值
对于普通实例变量,Java程序可以对它执行默认的初始化,也就是将实力变量的值指定为默认的初始值0或null,但对于final实例变量,则必须由程序员显示指定初始值。
final实例变量必须显示地被赋初始值,而且本质上final实例变量只能在构造器中被赋初始值。在定义final实例变量时指定初始值,和在初始化块中为final实例变量指定初始值本质上是一样的。除此之外,final实例变量将不能被再次赋值。
final修饰的类变量

对于final类变量而言,同样必须显示指定初始值,而且final类变量只能在2个地方指定初始值:
定义final类变量时指定初始值;
在静态初始化块中为final类变量指定初始值;
这两种方式都会被抽取到静态初始化块中赋初始值。定义final类变量时指定初始值和在静态初始化块中为final类变量指定初始值,本质是一样的。除此之外final类变量将不能被再次赋值。
final修饰局部变量

final修饰的局部变量一样需要被显式地赋初始值,因为Java本来就要求局部变量必须被显式地赋初始值。与普通变量不同的是,final修饰的局部变量被赋初始值之后,将不能再被重新赋值。
final修饰符的第一简单的功能就是一旦被赋初始值,将不可改变。
final的另一个简单的功能就是在定义了该final类变量时指定了初始值,且该初始值可以在编译时就被确定下来,系统将不会在静态初始化块中对该类变量赋初始值,而将是在类定义中直接使用该初始化值代替该final变量。
对于一个使用final修饰的变量而言,如果定义该final变量时就指定初始值,而且这个初始值可以在编译时就确定下来,那么这个final变量将不再是一个变量,系统会将其变成“宏变量”处理。所有出现该变量的地方,系统将直接把它当成对应的值处理。
执行“宏替换”的变量

对于一个final变量,不管它是类变量、实例变量还是局部变量,定义了该变量时使用了final修饰符修饰,并在定义该final类变量时指定了初始值,而且该初始值可以在编译时就被确定下来,那么这个final变量本质上已经不再是变量,而是想当于一个直接的变量。
final修饰符的一个重要用途就是定义“宏变量“,当定义final变量时就为该变量指定了初始值,而且该初始值可以在编译的时候就确定下来,那么这个final变量本质上就是一个”宏变量“,编译器会把程序中所用到该变量的地方直接替换成该变量的值。如果被赋的表达式只是基本的算术运算表达式或字符串连接运算,没有访问普通变量,调用方法,Java编译器同样会将这种final变量当成”宏变量“处理。
对于实例变量而言,可以在定义该变量时赋初始值之外,还可以在非静态初始化块、构造器中对它赋初始值,在这三个地方指定初始值的效果基本一样。但对于final实例变量而言,只有在定义该变量时指定初始值才会有”宏变量“的效果,在非静态初始化块、构造器中为final实例变量指定初始值则不会有这种效果。对于普通类变量而言,在定义时指定初始值,在静态初始化块中赋初始值的效果基本一样。但对于final类变量而言,只有在定义final类变量时指定初始值,系统才会对该final类变量执行”宏替换“
final方法不能重写
当final修饰某个方法时, 用于限制该方法不可被它的子类重写。

如果父类中某个方法使用了final修饰符进行修饰,这个方法将不可能被子类访问到,因此这个方法也不可能被它的子类重写。private和final同时修某个方法是没有太大意义,但是被Java语法允许。
如果父类和子类没有处于同一个包下,父类中包含的某个方法不使用访问控制符(相当于包访问权限)或者仅使用private访问控制符,那子类也是无法重写该方法的。


内部类中的局部变量
不仅匿名内部类,即使是普通内部类,在任何内部类中访问的局部变量都应该使用final修饰。

此处说的内部类指的是局部内部类,只有局部内部类(包括匿名内部类)才可以访问局部变量,普通静态内部类、非静态内部类不可能访问方法体内的局部变量。
Java要求所有被内部类访问的局部变量都使用final修饰,对于普通局部变量而言,它的作用域就是停留在该方法内,当方法执行结束,该局部变量也随之消失。但内部类则可能产生隐式的”闭包“闭包将使得局部变量脱离它所在的方法继续存在。
匿名内部类的实例生命周期没有结束的话,将一直可以访问局部变量的值,这就是内部类会扩大局部变量作用域的实例。
由于内部类可能扩大局部变量的作用域,如果再加上这个被内部类访问的局部变量没有使用final修饰,也就是说该变量的值可以随意改变,就会引起大乱。因此Java编译器要求所有被内部类访问的局部变量必须使用final修饰。

Java之final修饰变量相关推荐

  1. Java中final修饰变量

    一:final修饰的变量即成为常量,只能赋值一次,但是final所修饰局部变量和 员变量有所不同. (1)final修饰的局部变量必须使用之前被赋值一次才能使用 (2)final修饰的成员变量在声明时 ...

  2. java 线程参数 用final,JAVA 关于final修饰变量参数

    很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,我们需要注意的是,在final修饰的方法参数中,如果修饰的是基本类型,那 ...

  3. java 中final修饰的变量_java中final修饰符的使用方法

    本文为大家分享了java中final修饰符的使用,供大家参考,具体内容如下 1.final修饰符的用法: final可以修饰变量,被final修饰的变量被赋初始值之后,不能对它重新赋值. final可 ...

  4. Java中final修饰符的理解

    记录一下今天复习的final修饰符,其中 final类的成员方法隐式被final修饰部分 仅代表我个人理解 总结如下: final有三种使用方法: 1.final修饰类 final修饰类表示这个类不能 ...

  5. JAVA中final修饰参数

    1. final 修饰在变量上,说明这个变量的值不能修改 final 修饰在方法上,说明这个方法在继承后不能覆盖. final 修饰在类上,说明这个类为终态,不能被继承了. 2.final类型修饰的参 ...

  6. final修饰变量、方法、类的作用

    1.final修饰类 final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展, ...

  7. java的final修饰_java final 修饰符详解

    final修饰符究竟有什么作用,我们该如何使用,对我们的应用开发又能够起到什么作用,有java基础的肯定是不难说出final的几个用法, 1.被final修饰的变量在首次被初始化之后是不能够再次被赋值 ...

  8. 有关于java的final修饰符

    近期在学习java,今天看到final修饰符的问题,我书上有个很有意思的句子,如果用final修饰符修饰一个可变的对象的话,final修饰符只能让这个引用对象的变量不变,换言之,它指向的对象不变,但对 ...

  9. Java中Final修饰对象

    Final修饰对象 众所周知,final是java的关键字,修饰符,用于声明属性(属性不可变).方法(方法不可重写)和类(类不可继承),那么final可以修饰对象么,修饰对象又是代表着什么? 先看一个 ...

最新文章

  1. php swoole编译,编译安装swoole1.7.9,PHP版本5.6.5
  2. 计算机英语unit,计算机专业英语Unit 7
  3. GT Transceiver中的重要时钟及其关系(2)单个外部参考时钟使用模型
  4. 10.5 QQ 支持
  5. Dijkstra算法的另一种证明
  6. redis 内存溢出_Redis为何这么快数据存储角度
  7. java名 java_Java Syncrhonisers
  8. idea+springboot+mongodb的实战使用分享
  9. [C++] map 使用场合
  10. java小程序之学生信息_java小程序之学生信息录入界面
  11. smarty变量调节器--cat[连接字符串]
  12. mysql返回的数据是什么格式_磁盘格式化后能恢复数据吗?先了解什么是格式化...
  13. java设置字体大小_java中控制字体大小的设置
  14. python snownlp情感分析和词云分析
  15. 安装PyCharm(最完整版)
  16. 如何应对开源组件⻛险?软件成分安全分析(SCA)能力的建设与演进
  17. fixed Your CLT does not support macOS 11
  18. C语言windows.h库的常用函数(四)
  19. Scratch软件编程等级考试一级——20220619
  20. 哪些行业的物联网前景比较好?

热门文章

  1. 海外英语杂志海外英语杂志社海外英语编辑部2022年第8期目录
  2. 计算机类毕业参考文献(java开发)
  3. 该如何管理我们的知识?
  4. C++ 拓扑排序(AOV网络)
  5. EasyPR--一个开源的中文车牌识别系统
  6. linux - syslog详解
  7. 西南科技大学学生邮箱申请
  8. 解决pip install ninjia 后,依旧报错的问题
  9. 7-1 判断两个数是否互质
  10. PHP不包括字母,数字和下划线的webshell