一概述
final 是 Java 关键字中最常见之一, 表示最终的, 不可更改之意, 在 Java 中也正是这个意思
有 final 修饰的内容, 就会变得与众不同, 它们会变成终极存在, 其内容成为固定的存在
二作用
2.1 final 修饰变量
变量被 final 修饰就会变成为常量, 常量被保存在方法区中
变量一旦被 final 修饰, 必须手动进行初始化, 未进行初始化的 final 常量是无法通过编译的
如果只有 final 修饰的变量的初始化可以采用:
-- 定义时赋值
-- 代码块赋值
-- 构造器赋值
如果被 static 和 final 同时修饰的变量的初始化可以采用:
-- 定义时赋值
-- 静态代码块赋值
一旦 final 变量被 static 修饰, 那么它就脱离了对象的组织 (代码块构造器都是对象的组织), 升级为类的组织, 所以需要在类级别的静态代码块中进行初始化
- public class FinalTest {
- final int i = 1;
- int j = 2;
- static int m = 3;
- static final int n = 4;
- }
或
- public class FinalTest {
- final int i;
- int j;
- static int m;
- static final int n;
- {
- i = 1;
- }
- static {
- n = 3;
- }
- }
如果将上面的代码改成:
- public class FinalTest {
- final int i;
- int j;
- static int m;
- static final int n;
- }
上面代码第 2 行和第 5 行会报错, 原因就是未进行初始化
那么我们总结下 final 和 static 的现象, 用于区分二者:
static 修饰将内容脱离对象成为类成员
final 修饰将内容改造成必须被手动初始化的成员, 一旦赋值, 不再改变
二者可以同时存在, 各起各的作用
2.2 final 修饰方法
被 final 修饰的方法, 可以被子类继承, 但是不能被子类重写, 也就是说这个方法在此以后其内部的实现就是固定不变的了, 不能被改变
2.3 final 修饰类
被 final 修饰的类, 被称之为最终类, 其不再拥有子类, 不可再进行扩展, 最常见的 final 类就是 String 类
String 类被 final 修饰之后, 其每个对象都是不变的, 一旦定义就不再发生改变
2.4 final 修饰局部变量
final 修饰的局部变量, 如果方法的参数被 final 修饰, 那么这个参数的值在从方法调用时赋值开始就不能再改变, 不能被重新赋值 (不能改成他值)
最常使用的地方就是局部内部类在访问方法的局部变量的情况下, 这些局部变量就需要使用 final 修饰, 因为当局部内部类访问局部变量时, 会放大局部变量的作用域, 局部变量一般在方法结束时就失效了, 但是却有可能任然被内部类的对象持有使用将该局部变量定义为 final 之后, 它不再保存于栈空间, 而是保存在方法区中, 自然不会因为方法的结束而丢失
- public void outMethod(){
- final int s = 1;
- class innerClass{
- public void innerMethod(){
- System.out.println(s);
- }
- }
- }
如果去掉第 2 行的 final, 第 5 行就会报错
来源: https://www.cnblogs.com/V1haoge/p/8482909.html