深入理解Java中的final关键字

来源:互联网 发布:python urllib介绍 编辑:程序博客网 时间:2024/06/03 13:21

一 final修饰变量

客套话:

Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例。final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的。

 

工作里,final经常与static关键词一起使用:

private final static  Log log = LogFactory.getLog(MemcachedUtil.class);
private static final int DEFAULT_LOCK_SECCONDS=5;



下面讲一下其它用法:   

package test.filnal;public class User {private String userName;private final String gender;//性别/** * 构造函数 * @param userName * @param gender */public User(String userName, String gender){this.userName = userName;this.gender = gender;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getGender() {return gender;}@Overridepublic String toString() {return "姓名:"+userName+", 性别:"+gender;}}
这里User类有两个属性,userName, gender字段,表示人的性别,人一出生,性别即确定(除非去泰国一次大笑), 所以gender属性申明为final,即,gender初始化之后值不可修改


我们发现User类里gender属性少一个set方法,如果加上该方法,会怎么样呢

public void setGender(String gender) {    this.gender = gender;}

直接编译报错了:



二 final修饰方法

final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。下面是final方法的例子(Jdk里java.lang.Object类中的wait方法就有final关键字修饰):

    public final void wait(long timeout, int nanos) throws InterruptedException {        if (timeout < 0) {            throw new IllegalArgumentException("timeout value is negative");        }        if (nanos < 0 || nanos > 999999) {            throw new IllegalArgumentException(                                "nanosecond timeout value out of range");        }        if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {            timeout++;        }        wait(timeout);    }


三 final修饰类

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

public final class String{    ...}


final关键字的好处

下面总结了一些使用final关键字的好处

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








0 0