深入理解Java中的final關鍵字

一 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;
	}
	
	@Override
	public 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會對方法、變量及類進行優化。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章