final有三種修飾情況:
1)修飾成員
分配一塊存儲空間,只能賦值一次。可以在運行時賦值。
static final和final的區別在於前者是類級(全局),後者是對象級(局部)。
final修飾對象或數組的意思是變量的引用不能改,但是引用對象或數組的賦值是可以改的。
2)修飾方法
final修飾方法的參數時,意味着你無法在方法中更改參數引用所指向的對象。
final修飾的方法不會被重載。
final修飾的方法允許編譯器轉爲內嵌,避免調用的開銷。
3)修飾類
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