http://docs.oracle.com/javase/tutorial/java/IandI/final.html
Writing Final Classes and Methods
You can declare some or all of a class's methods final. You use the final keyword in a method declaration to indicate that the method cannot be overridden by subclasses. The Object class does this—a number of its methods are final.
You might wish to make a method final if it has an implementation that should not be changed and it is critical to the consistent state of the object. For example, you might want to make the getFirstPlayer method in this ChessAlgorithm class final:
class ChessAlgorithm {
enum ChessPlayer { WHITE, BLACK }
...
final ChessPlayer getFirstPlayer() {
return ChessPlayer.WHITE;
}
...
}
Methods called from constructors should generally be declared final. If a constructor calls a non-final method, a subclass may redefine that method with surprising or undesirable results.
Note that you can also declare an entire class final. A class that is declared final cannot be subclassed. This is particularly useful, for example, when creating an immutable class like the String class.
從構造函數中調用的方法最好聲明爲final。若是構造調用了非final的方法,子類若是從新定義了那個方法,會帶來意想不到的結果。
請注意你能夠聲明整個類是final的。被聲明爲final的類不會有子類。html
參考博客:
java
http://blog.csdn.net/andie_guo/article/details/12885885
編程
根據程序上下文環境,Java關鍵字final有「這是沒法改變的」或者「終態的」含義,它能夠修飾非抽象類、非抽象類成員方法和變量。你可能出於兩種理解而須要阻止改變:設計或效率。
數組
final類不能被繼承,沒有子類,final類中的方法默認是final的。oracle
final方法不能被子類的方法覆蓋,但能夠被繼承。函數
final成員變量表示常量,只能被賦值一次,賦值後值再也不改變。測試
final不能用於修飾構造方法。this
注意:父類的private成員方法是不能被子類方法覆蓋的,所以private類型的方法默認是final類型的。
spa
一個永不改變的編譯時常量。.net
一個在運行時被初始化的值,而以後沒法被改變;
一個既是static又是final的域:是一段不能改變的存儲空間;
final類型運用於數據:
基本數據類型(int、double、char...)運用final時,使數值恆定不變;
對象引用運用final時,final使得引用恆定不變,引用內部的數據若不是final型,能夠進行修改。
數組類型運用final時,final使得數組引用恆定不變,數組內部的數據若不是final型,能夠進行修改。
final與static
final指明數據爲一個常量,恆定沒法修改;
static指明數據只佔用一份存儲區域;
public final class FinalData { private final int valueOne = 3; private int valueTwo = 4; private final int[] a = {1,2,3,4,5,6,7,8,9}; private int[] b = {1,2,3,4,5,6,7,8,9}; private static final int VAL_TWO = 3; public static void main(String[] args) { FinalData finalData = new FinalData(); /*-----------基本類型測試------------------------------------*/ // finalData.valueOne = 4;//valueOne是常量,沒法修改 finalData.valueTwo = 14;//valueTwo不是常量,能夠修改 /*-----------對象類型測試------------------------------------*/ // finalData.v1 = new Value(5);//v1對象是final型常量,其引用是沒法修改的。 /*-----------數組類型測試------------------------------------*/ // finalData.a = new int[3];//數組a是final型,沒法修改a的引用 finalData.b = new int[13];//數組b不是final型,能夠對其引用進行修改 for(int i=0;i<finalData.a.length;i++) finalData.a[i]++;//數組a內部數據是int型,不是final型,能夠修改 /*-----------static final類型測試------------------------------------*/ // finalData.VAL_TWO = 4; //定義爲private,只能被本類的方法調用;定義爲static,則強調只有一份,且只被執行一次;定義爲final,則說明它是一個常量,沒法被修改。 } }
若是一個類不容許其子類覆蓋某個方法,則能夠把這個方法聲明爲final方法。
把方法鎖定,防止任何繼承類修改它的意義和實現。
高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提升執行效率。
public class FinalDemo { public void f(){ System.out.println("FianlDemo.f()"); } public final void g(){ System.out.println("FianlDemo.g()"); } }
繼承類
public class FinalOverriding extends FinalDemo{ public void f(){ System.out.println("FinalOverriding.f()"); } // public void g(){//沒法覆蓋父類的final方法g() // System.out.println("FinalOverriding.g()"); // } }
final類不能被繼承,所以final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,若是這個類不須要有子類,類的實現細節不容許改變,而且確信這個類不會載被擴展,那麼就設計爲final類。例如:java.lang.String
《Java編程思想(美)Bruce Eckel著 陳昊鵬 譯》