0%

Java关键字

Java里面的关键字和相关的知识点

final 关键字

final 可以声明成员变、方法、类和本地变量。一旦将引用声明为 final,这个引用就不能改变了。

final 变量

凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为 final 的都叫作 final 变量。final 变量经常和 static 关键字一起使用,作为常量。

final 方法

声明为 final 的方法不能被子类的方法重写。
final 方法比非 final 方法要快,因为编译的时候已经静态绑定,不需要运行时再动态绑定。

final类

final 修饰的类不能被继承。Java 中有 String,Integer 和其他包装类都是 final 类。

final关键字的好处

  1. 提高性能,JVM 和 Java 应用都会缓存final变量。
  2. 可以在安全的多线程环境下进行共享,不需要额外的同步开销。
  3. 使用 final 关键字,JVM 会对方法、变量和类进行优化。

不可变类

不可变类是指对象一旦创建就不能更改,要使用 final 关键字创建。

为什么字符串类需要是不可变的?

  • 实现字符串池,节省 heap 空间。如果是可变的那么 String interning 就不能实现了,因为这样的话如果变量改变了他的值,那么这个值的变量的值也会一起改变。
  • 安全问题:比如数据库的用户名密码都是字符串形式传入数据库的连接,可变的话就有风险被篡改。
  • 多线程安全,字符串可以被多个线程共享。
  • 类加载器要用到字符串。比如你想加载 java.sql.Connection 类,而这个值被改成了 myhacked.Connection,那么会对你的数据库造成不可知的破坏。
  • 创建的时候 hashcode 就被缓存了,不需要重新计算。这使得字符串很适合作为Map中的键,字符串的处理速度要快过其他的键对象。

如何写一个不可变类

其他要点

  • final 成员变量必须在声明的时候初始化或者在构造器中初始化,否则编译报错。
  • 匿名类所有变量必须是 final 的。
  • 接口中所有变量本身是 final 的
  • final 和 abstract 是冲突的,不能同时使用。
  • 集合对象声明为 final,引用不能被更改,但是不影响增删改查内部元素。

(来源:深入理解Java中的final关键字为什么String类是不可变的)