JAVA中的final关键字

final关键字可应用于类、方法或变量。

注意点:

  • final修饰的类不能被子类化(扩展)
  • final修饰的方法不能被重写
  • 空缺final变量必须在构造函数中初始化。如果空缺final变量在某个构造函数中初始化,就必须在类的所有重载构造函数中进行初始化
  • 空缺final变量仅可以设置一次
  • 空缺final变量必须在使用前进行设置
  • 由于private 和 static 方法不能在子类中被重写,因此它们总是隐式地为final

注释:空缺final变量是一种声明为final但未初始化的变量,如 public final int ID;

好处:

  1. 可以显示防止子类中的方法重写。
  2. final方法会告诉编译器对于final方法的调用不需要动态绑定,这会让代码便得略微更有效些。静态绑定总是比动态绑定高兴,因为在动态绑定中,运行时需要解析方法调用。
  3. 能带来更好的效率。将方法标记为final可以让编译器将所有的final方法的调用转变为内联调用。当编译器看到final方法调用时,可以根据自己的判断,略去一般通过方法调用机制插入代码的那套路数。调用机制包括将方法参数压栈、清除栈参数和最后处理返回值。与这套方法不同,编译器现在可以在方法体中使用实际代码替换方法调用。不过,如果方法过大,那么在方法调用和返回方面实际节省的好处将会变得很小,这取决于方法内部花去的时间总量。一般来说,短小的方法能够从内联获益。内联的好处不局限与方法的大小,因为这还常常会带来一些进一步的优化,如减少无用代码和更多内联。

注意:Java不允许显示第标记方法为内联方法。编译器会根据自己的判断,在代码中奖方法标记为“final”。

摘自《Java 7 编程高级进阶》 Poornachandra Sarang 著 曹如进 张方勇 译 清华大学出版社

发表评论