java final关键字

根据上下文环境,Java的关键字final的含义存在着细微的区别,但通常它指的是“这是无法改变的”。不想做改变可能处于两种理由:设计或效率。由于这两个原因相差很远,所以关键字final有可能被误用。

下面谈论了可能使用final的三种情况:数据、方法和类。

1,final数据

许多编程语言都有某种方法,来向编译器告知这一块数据是恒定不变得。有时数据的恒定不变是很有用的。比如:

1)一个永不改变的编译时常量

2)一个在运行时被初始化的值,而你不希望它被改变。

对于编译期常量这种情况,编译器可以将该常量代入任何可能用到它的计算式中。也就是说,可以在编译时执行计算式,这减轻了一些运行时的负担。在java中 ,这类常量必须是基本数据类型,并且以关键字final表示,在对这个常量进行定义的时候,必须对其进行赋值,

一个既是static又是final的域只占据一段不能改变的存储空间。

当对对象引用而不是基本类型运用final时,其含义会有一点令人迷惑。对于基本类型,final使数值恒定不变;而对于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的。Java并未提供使任何对象恒定不变得途径。这一限制同样适用数组,它也是对象。

我们不能因为某数据是final的就认为在编译时可以知道它的值。将final数值定义为静态和非静态页有所区别。此区别只有当数值在运行时被初始化才会显现,这是因为编译器对编译时数值一视同仁。当运行程序时就会看到这一区别。static在装载时已被初始化,而不是每次创建新对象时都初始化。


2,final方法

使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义。这是出于设计的考虑:想要确保在继承中使方法行为保持不变,并且不会被覆盖。

过去简易使用final方法的第二个原因是效率。在Java早期实现中,如果将一个方法指明为final ,就是同意编译器将针对该方法的所有调用都转为内嵌调用。当编译器发现一个final方法调用命令时,它会根据自己的谨慎判断,跳过插入程序代码这种正常方式而执行方法调用机制(将参数压人栈,跳至方法代码处并执行,然后跳回并清理栈中的参数,处理返回值),并且以方法体中的实际代码的副本来替代方法调用。这将消除方法调用的开销。当然,如果一个方法很大,你的程序代码就会膨胀,因而可能看不到内嵌带来的任何性能提高,因为,所带来的性能提高会因为花费于方法内的时间量而缩减。


final和private关键字

类中所有的private方法都隐式地指定为是final的。由于无法取用private方法,所以也就无法覆盖它。可以对private方法添加final修饰词,但这并不能给该方法增加任何额外的意义。


3, final类

当将某个类的整体定义为final时,就表明了你不打算继承该类,而且也不允许别人这样做。换句话说,处于某种考虑,你对该类的设计永不需要做任何变动,或者处于安全的考虑,你不希望它有子类。

final类的域可以根据个人的意愿选择为是不是final。不论类是否被定义为final,相同的规则则都适用于定义为final的域。然而,由于final类禁止继承,所以final类中所有的方法都隐式指定为final的。因为无法覆盖他们。在final类中可以给方法添加final修饰词,但这不会增添任何意义。


4,有关final的忠告

在设计类时,将方法指明是final的,应该说是明智的。你可能会觉得,没人会想要覆盖你的方法,有时这是对的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值