java學習:理解final

final有三種修飾情況:

1)修飾成員

分配一塊存儲空間,只能賦值一次。可以在運行時賦值。

static final和final的區別在於前者是類級(全局),後者是對象級(局部)。

final修飾對象或數組的意思是變量的引用不能改,但是引用對象或數組的賦值是可以改的。

2)修飾方法

final修飾方法的參數時,意味着你無法在方法中更改參數引用所指向的對象。

final修飾的方法不會被重載。

final修飾的方法允許編譯器轉爲內嵌,避免調用的開銷。

3)修飾類

final修飾的類禁止繼承(出於安全考慮)。

下面的代碼描述了一個人嚇跑一頭豬和一隻狗的故事:

    package TestFinal;  
  1.  
  2. public class Entry  
  3. {   
  4.     public static void main(String args[])   
  5.     {   
  6.         Pig pig = new Pig();  
  7.         Dog dog = new Dog();  
  8.         Person person = new Person();  
  9.         person.frighten(pig);//嚇跑豬
  10.         person.frighten(dog);//嚇跑狗 
  11.     }   
  12. }  
  13.  
  14. class Person{  
  15.     void frighten(Animal animal){  
  16.         System.out.println("Ho!");  
  17.         animal.run();//多態  
  18.     }  
  19. }  
  20.  
  21. class Animal{  
  22.     void run(){//此方法聲明爲private和final都會出錯  
  23.         System.out.println("Animal run ...");  
  24.     }  
  25. }  
  26.  
  27. class Pig extends Animal{  
  28.     void run(){  
  29.         System.out.println("Pig run ...");  
  30.     }     
  31. }  
  32.  
  33. class Dog extends Animal{  
  34.     void run(){  
  35.         System.out.println("Dog run ...");  
  36.     }     

程序運行結果:

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

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