final有三種修飾狀況:數組
1)修飾成員安全
分配一塊存儲空間,只能賦值一次。能夠在運行時賦值。ide
static final和final的區別在於前者是類級(全局),後者是對象級(局部)。spa
final修飾對象或數組的意思是變量的引用不能改,可是引用對象或數組的賦值是能夠改的。對象
2)修飾方法繼承
final修飾方法的參數時,意味着你沒法在方法中更改參數引用所指向的對象。編譯器
final修飾的方法不會被重載。string
final修飾的方法容許編譯器轉爲內嵌,避免調用的開銷。it
3)修飾類io
final修飾的類禁止繼承(出於安全考慮)。
下面的代碼描述了一我的嚇跑一頭豬和一隻狗的故事:
package TestFinal;
- public class Entry
- {
- public static void main(String args[])
- {
- Pig pig = new Pig();
- Dog dog = new Dog();
- Person person = new Person();
- person.frighten(pig);//嚇跑豬
- person.frighten(dog);//嚇跑狗
- }
- }
- class Person{
- void frighten(Animal animal){
- System.out.println("Ho!");
- animal.run();//多態
- }
- }
- class Animal{
- void run(){//此方法聲明爲private和final都會出錯
- System.out.println("Animal run ...");
- }
- }
- class Pig extends Animal{
- void run(){
- System.out.println("Pig run ...");
- }
- }
- class Dog extends Animal{
- void run(){
- System.out.println("Dog run ...");
- }
- }
程序運行結果:
Ho!
Pig run ...
Ho!
Dog run ...
請注意到person.frighten對animal.run的調用,由於輸入參數的子類不一樣,實際執行的代碼片段是不一樣的,這就是「多態」。
若是Animal的run方法聲明爲private,不影響Dog和Pig能夠定義本身的run方法,可是「多態」就沒有了,person.frighten中animal.run會報錯。
若是Animal的run方法聲明爲final,person.frighten中animal.run不會報錯,可是Dog和Pig中定義run方法會報「不容許重載」的錯誤信息,固然也就談不上「多態」了。
參考書:《Thinking in Java 3th Edition》 Bruce Eckel