java学习:理解final

本文详细解析了Java中的final关键字,包括其在修饰成员变量、方法及类时的不同含义,并通过实例展示了final修饰方法如何影响多态特性。

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





 本文转自 hexiaini235 51CTO博客,原文链接:http://blog.51cto.com/idata/1148245,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值