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