一 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關鍵字的好處
- final關鍵字提高了性能。JVM和Java應用都會緩存final變量。
- final變量可以安全的在多線程環境下進行共享,而不需要額外的同步開銷。
- 使用final關鍵字,JVM會對方法、變量及類進行優化。