Java关键字之final

作者: 小丸子的呆地 | 来源:发表于2021-07-17 17:32 被阅读0次

final关键字可以用来修饰类、变量、方法。

  • 被修饰的类不能被继承。
  • 被修饰的变量一旦赋值,则不能修改。
  • 被修饰的方法不能被子类重写,但是可以被重载。

final 局部变量

声明的时候可以不赋值,使用之前一定要赋值,否则编译错误。

final 成员变量

必须在声明的时候赋值或者代码块中赋值。

final static 局部变量

被final 和 static 同时修饰的类变量为常量。

  • 需要在声明的时候赋值或者静态代码块中赋值
  • 静态常量,编译期常量,编译时就确定值。(Java代码执行顺序,先编译为class文件,在用虚拟机加载class文件执行)
  • 放于方法区中的静态常量池。
  • 在编译阶段存入调用类的常量池中
  • 如果调用此常量的类不是定义常量的类,那么不会初始化定义常量的类,因为在编译阶段通过常量传播优化,已经将常量存到调用类的常量池中了

匿名内部类和内部类使用外部类的局部变量时为什么要加final

R大的三篇文章:
关于对象与闭包的关系的一个有趣小故事
JVM的规范中允许编程语言语义中创建闭包(closure)吗?
为什么Java闭包不能通过返回值之外的方式向外传递值?

因为匿名内部类和内部类的实现其实是JVM帮我们悄悄生成了一个新的class,这也是,并且将依赖的外部类的变量做了一个copy放在了新类下,从理论上这两个变量应当保证一致,所以使用final 修饰,干脆让其不可变,也就不会发生不一致。

JDK1.8之前是需要显示的添加final修饰局部变量。

JDK1.8开始不用添加了。


image.png

但是这只是一颗语法糖,编译完成之后,仍然会被加上final,不信可以尝试在内部类中修改外部局部变量,一样会编译错误。


image.png

相关文章

网友评论

    本文标题:Java关键字之final

    本文链接:https://www.haomeiwen.com/subject/ubewpltx.html