Java Final关键字

537 阅读2分钟

final关键字的使用

1.修饰类

表明这个类不能被继承,类中所有成员方法都会被隐式地指定为final方法,比如:String类,Integer及其他包装类

2.修饰方法

表明该方法不能被子类重写

3.修饰变量

如果final修饰基本数据类型的变量,其数值一旦初始化后不能被修改。

如果final修饰引用类型的变量,初始化后不能再让其指向另一个对象,但引用类型变量指向的对象的内容是可变的。

例如:

class Person {
    public int age = 0
}
final Person person = new Person();
person.age = 20; // 引用变量的内容是可变的

如果final修饰成员变量时,成员变量必须在定义时或者构造器中进行初始化赋值,初始化赋值后不能被修改。

如果final修饰本地变量(方法中或代码块中的变量为本地变量)时,本地变量必须在声明时赋值,初始化赋值后不能被修改。

final关键字的优点

  1. final关键字提高了性能,JVM和Java应用都会缓存final变量

  2. final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

  3. 使用final关键字,JVM会对方法、变量及类进行优化。

    例如:

    final String name = "Tom";
    

    编译器在编译期间知道确切值,把它当做编译器常量使用,即在用到该final变量的地方,相当于直接访问这个常量,不需要在运行时确定。

    final String name = getName();
    

    编译器在编译期间不知道确切值,就不会做优化处理。

final关键字的注意点

  1. 接口中声明的所有变量本身都是final的。

  2. 在匿名类中所有变量都必须是final变量。

  3. final和abstract这两个关键字是反相关的,final类不可能是abstract的

  4. 对于集合对象声明为final,其引用不能被更改,但是可以向其中增加、删除或改变内容。

    例如:

    private final List<Person> persons = new ArrayList<Person>();
    persons.add("Tom");
    persons.add("Jack");
    //persons = new Vector(); --- 引用不能被更改
    
  5. 将类、方法、变量声明为final能够提高性能、这样JVM就有机会进行估计,然后优化。

  6. static修饰成员变量表示只保存一份副本,final修饰成员变量用来保证变量不可变。

  7. final方法在编译阶段绑定,称为静态绑定。