final关键字

根据上下文,final的含义有细微的差别,但通常它指的是“这是无法改变的”。不想做出改变可能出于两种理由:设计和效率。 final一般用于三种情况:变量、方法和类。

final变量

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

public static final String DEL_FLAG_NORMAL = "0";
public static final String DEL_FLAG_DELETE = "1";
public static final String DEL_FLAG_AUDIT = "2";

final方法

final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。

class Person {
    public final String getName() {
        return "Person";
    }

}

class Man extends Person{

    @Override // 编译错误
    public String getName() {
        return "Man";
    }

}

final类

使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。

final class Person {}

// 编译错误
class Man extends Person {}

final关键字的好处?

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

关键点

  • 一个既是static又是final的域只占据一段不能改变的存储空间。
  • 对于基本类型,final使数值恒定不变;对于对象引用,final使引用恒定不变。一旦引用被final初始化执行一个对象,就无法再把它指向另一个对象。然而,对象本身是可以改变的,Java并未提供任何使对象恒定不变的途径(可以自己编写类以实现对象恒定不变的效果)。
  • 根据惯例,既是static又是final的域(编译期常量)将用大写表示,并使用下划线分割各个单词。
  • Java允许在参数列表中以声明的方式将参数指明为final,这意味着无法在方法中更改参数引用所指向的对象。
  • 类中所有的private方法都隐式的指定为是final的。
  • 类声明为final时,表明了你不打算继承该类,而且也不允许别人这样做。由于final类禁止继承,所以final类中所有的方法都隐式指定为final。
上篇Java Tips
下篇Java 中的 enum