使用 final 方法的原因有两个。第一个原因是把方法锁定,以预防任何继承类修改它的意义。
这是出于设计的考虑:你想要确保在继承中方法行为保持不变,并且不会被重载。
使用final方法的第二个原因是效率。如果你将一个方法指明为final,就是同意编译器将针对
该方法的所有调用都转为内嵌(inline)调用。当编译器发现一个final方法调用命令时,它
会根据自己的谨慎判断,跳过插入程序代码的正常方式而执行方法调用机制(将参数压入栈,
跳至方法代码处并执行,然后跳回并清除栈中的参数,处理返回值。),并且以方法体中的实
际代码的复本来替代方法调用。这将消除方法调用的开销。当然,如果一个方法很大,你的
程序代码就会膨胀,你可能看不到内嵌带来的任何性能提高,因此,你所取得的性能提高会
因为花费于方法内的时间总量而被缩减。这意味着Java编译器能够观察到这些情况并明智地
抉择是否对final方法执行内嵌动作。然而,最好是让编译器和JVM仅在你明确表示要阻止重
载时,再处理效率事项,并将方法指明为final 。
类中所有的 private 方法都被隐含是 final 的。由于你无法取用 private 方法,所以你也无法
重载之。你可以对 private 方法增加 final 修饰符,但这并不能给该方法增加任何额外的意
义。
这一问题会造成混淆。因为如果你试图重载一个 private 方法(隐含是 final 的),看起来是
奏效的,而且编译器也不会给出错误信息
“重载”只有在某方法是基类的接口的一部分时才会出现。即,你必须能将一个对象向上转
型为它的基本类型并调用相同的方法(这一点在下一章将得以阐明)。如果某方法为 private,
它就不是基类的接口的一部分。它仅是一些隐藏于类中的程序代码,不过具有相同的名称而
已。但你如果在导出类中以相同的名称生成一个 public、protected 或包访问权限(package
access)方法的话,该方法就不会产生在基类中出现的“仅具有相同名称”的情况。此时你
并没有重载方法,你仅是生成了一个新的方法。由于 private 方法无法触及又不能有效隐藏,
所以仅仅是因为考虑到定义它的类的程序代码组织,它们才有存在的意义,除此之外,其他
任何事物都不需要把它纳入考虑的范畴。