Java的final关键字
在《Java关键字分类解析》里介绍了所有Java关键字和保留字的基本用途,到《Java修饰符及其作用对象》又介绍了所有Java修饰符的应用。通过修饰符的表格看到final是唯一一个可以在类(Class)、方法Method、变量(Variable)上都能应用的,但前文也提到final
在这些作用对象上的效果是不太一样的,本文就详细展开介绍一下final
的具体效果。
final class
当一个类被定义成final class
,表示该类的不能被其他类继承,即不能用在extends之后。否则在编译期间就会得到错误。
[codesyntax lang=”java” lines=”normal”]
package com.iderzheng.finalkeyword; public final class FinalClass { } // Error: cannot inherit from final class PackageClass extends FinalClass { }
[/codesyntax]
Java支持把class定义成final
,似乎违背了面向对象编程的基本原则,但在另一方面,封闭的类也保证了该类的所有方法都是固定不变的,不会有子类的覆盖方法需要去动态加载。这给编译器做优化时提供了更多的可能,最好的例子是String,它就是final类,Java编译器就可以把字符串常量(那些包含在双引号中的内容)直接变成String
对象,同时对运算符+
的操作直接优化成新的常量,因为final
修饰保证了不会有子类对拼接操作返回不同的值。
对于所有不同的类定义—顶层类(全局或包可见)、嵌套类(内部类或静态嵌套类)都可以用final来修饰。但是一般来说final多用来修饰在被定义成全局(public)的类上,因为对于非全局类,访问修饰符已经将他们限制了它们的也可见性,想要继承这些类已经很困难,就不用再加一层final限制。
另外要提到的是匿名类(Anonymous Class)虽然说同样不能被继承,但它们并没有被编译器限制成final
。
[codesyntax lang=”java” lines=”normal”]
import java.lang.reflect.Modifier; public class Main { public static void main(String[] args) { Runnable anonymous = new Runnable() { @Override public void run() { } }; System.out.println(Modifier.isFinal(anonymous.getClass().getModifiers())); } } // Output: // false
[/codesyntax]
Read More →