Java基础的查漏补缺|Java基础查漏补缺之你可能不知道的final关键字的知识点


文章目录

  • final修饰符的用法:
  • final变量的赋值
  • final是宏常量
  • final方法不能被重写
  • 内部类中的局部变量
    • 为什么会这样?

final修饰符的用法:
  1. final可以修饰变量 被修饰的变量被赋予初始值之后就不能在被重新赋值
  2. final可以修饰方法 被修饰的方法不能被重写
  3. final可以修饰类 被修饰的类不能派生子类
final变量的赋值
  1. 在定义final变量 的时候指定赋给他初始值
  2. 在非静态初始块种为final赋值
  3. 在构造器中给final赋值
    我们通过javap工具可以发现这三种方式其实本质上都是在构造器中给final赋予初始值的
    由下图可以知道final是需要被赋予初始值的
    Java基础的查漏补缺|Java基础查漏补缺之你可能不知道的final关键字的知识点
    文章图片
final是宏常量 对于一个final变量来说 不论 它是类变量 实例变量 局部变量 只要它定义了final并且给final赋予了初始值那么这个final变量本质上就不再是变量了
它成为了一个直接量
【Java基础的查漏补缺|Java基础查漏补缺之你可能不知道的final关键字的知识点】我们举一个例子
String st=new String("Helloworld");

这是一个很简单的代码
它的加载的顺序是
  1. 在堆里面建立一个空间存放Helloworld
  2. 再栈里面建立一个String类型的st 并把它赋值为null
  3. 把存放Hellowrld的空间引用给st
    那么final的加载顺序是什么呢?
final String st="Helloworld";

答案是在编译的时候就直接确定了st里面是"hellowrld"
那么这个"Helloworld"是不是在栈里面?
答案是当然不是
Java基础的查漏补缺|Java基础查漏补缺之你可能不知道的final关键字的知识点
文章图片

final方法不能被重写 根据双亲委派机制我们可以知道一个类在加载的时候会先加载他的父类
但是如果父类的方法被final修饰的话那么子类就没有权限去访问父类的这个方法
对于子类来说这个方法是不存在的所以不能被重写
内部类中的局部变量 不论是匿名内部类还是普通内部类 任何内部类访问的局部变量都默认有final修饰
也就是说内部类不能修改局部变量
为什么会这样? 我们都知道局部变量的生命周期
当方法结束之后局部变量就会随之消失
但是
内部类可能会产生隐式的闭包,闭包将使局部变量脱离它所在的方法而继续存在
简单来说就是局部变量寄了 你内部类还没有寄 你要去修一个已经被修改的变量肯定是会出问题的

    推荐阅读