java学习:理解final

final有三种修饰状况:数组

1)修饰成员安全

分配一块存储空间,只能赋值一次。能够在运行时赋值。ide

static final和final的区别在于前者是类级(全局),后者是对象级(局部)。spa

final修饰对象或数组的意思是变量的引用不能改,可是引用对象或数组的赋值是能够改的。对象

2)修饰方法继承

final修饰方法的参数时,意味着你没法在方法中更改参数引用所指向的对象。编译器

final修饰的方法不会被重载。string

final修饰的方法容许编译器转为内嵌,避免调用的开销。it

3)修饰类io

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

相关文章
相关标签/搜索