Java中的final关键字非常重要,它可以应用于类、方法以及变量。final修饰的类不可被继承,方法不可被重写,变量值不可以被改变。
final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的。
什么是final变量?
凡是对成员变量或者局部变量声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。
这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变,但引用变量所指向的对象中的内容还是可以改变的。
class Animal {
private static final int COUNT = 80;
public static void main(String[] args) {
final StringBuffer sb = new StringBuffer("helloworld");
sb.append("java");
sb = new StringBuffer("hello"); //编译报错
}
}
什么是final方法?
final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。下面是final方法的例子:
class Animal {
public final String getName(){
return "animal" ;
}
}
class Dog extends Animal{
@Override
public final String getName(){
return "dog" ; //compilation error: overridden method is final
}
}
什么是final类?
使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。下面是final类的实例:
final class Animal {
public String getName(){
return "animal" ;
}
}
class Dog extends Animal{ //compilation error: cannot inherit from final class
}
下面总结了一些使用final关键字的好处:
final关键字提高了性能。JVM和Java应用都会缓存final变量。
final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
使用final关键字,JVM会对方法、变量及类进行优化。
关于final的重要知识点
final关键字可以用于成员变量、本地变量、方法以及类。
final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。例如
class Animal {
final int count = 0; //在定义时便给址值
final int i; //因为要在构造函数中进行初始化,所以此处便不可再给值
final List list; //此变量也与上面的一样
Animal() {
i = 100;
list = new LinkedList();
}
Animal(int k, List l) {
i = k;
list = l;
}
}
在匿名类中所有变量都必须是final变量。
final方法不能被重写。
final类不能被继承。
final关键字不同于finally关键字,后者用于异常处理。
final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
接口中声明的所有变量本身是final的。
final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
final方法在编译阶段绑定,称为静态绑定(static binding)。