A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© heheka123 中级黑马   /  2014-3-31 17:37  /  862 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1 什么是final类       API中的某些类,如String,以及Math等,就是final类的典型例子。虽然在Java编程中并不经常使用final类和final方法,但它们有着与众不同的特点,即final类不能被继承,不能被覆盖,以及final类在执行速度方面比一般类快。下面对final类和final方法的概念和编程技术分别加以讨论,最后解释为什么final类可以提高执行速度。
2  不能继承final类       有时在程序需要对继承加以限制。例如某些处理特殊运算和操作的类,为了安全理由,不允许被其他类所继承。final类没有子类,即它处于继承链的尾部,或者除了自动继承Object之外,它们是独立存在的支持类,例如执行密码管理的类,处理数据库信息的管理类等等。
       使用final类的另外一个理由是执行速度。由于它的方法不能够被覆盖,所以其地址引用和装载在编译期间完成,而不是在运行期间由JVM进行复杂的装载,因而简单和有效。所以如果没有必要,或者不存在有继承的可能性时,尽量使用final类。当然,在API类库中不多使用final类是因为它们是标准程序,希望在实际软件开发中得以广泛使用。而具体的应用软件开发则不同于标准库程序开发。
       注意final数据和final类的不同。final数据指常量,即其值一旦初始化,就不能改变。而final类则指不能被其他类所继承的类。
3 定义final类在类名前加以关键字final,这个类就被定义为final类,如:

public final class SomeClass {
    ...
}

或者,

public final class SomeClass extends SuperClass {
    ...
}

       当一个类被定义为final时,它的所有方法都自动成为final方法,但不影响对变量的定义。
4  不能覆盖final方法也可以在超类中定义某个方法为final方法。虽然这个类可以被继承,但子类不能够覆盖final方法。API类中的许多方法,如print()和println(),以及Math类中的所有方法都定义为final方法。在具体应用软件开发中,一些执行特殊性运算和操作的方法,可以定义为final方法。在方法的返回类型前加入关键字final,则定义该方法为final,如:

public final String printVersion() {        //定义final方法
    returnversion;
}
5  final参数       final参数的含义如同final变量一样,是常数参数,即当方法接受了这个参数后,其值不能改变。如下代码中定义方法的参数为final:

public void setVerison(final String version) {  //定义常量参数
    this.version= version;
}

       在这个方法中使用如下语句产生语法错误:

version = "other version…";                     //非法操作
6  提高执行速度       final类可以提高执行速度主要因为如下原因:
l  不涉及继承和覆盖。
l  其地址引用和装载在编译时完成。
l  在运行时不要求JVM执行因覆盖而产生的动态地址引用而花费时间和空间。
l  与继承链上的一般对象相比,垃圾回收器在收回final对象所占据的地址空间时也相对简单快捷。
       但在某些情况下使用final方法并不能取得提高执行速度的结果。因为并不是所有final方法其地址的装载和引用在编译时间完成。
假设类C继承了B,B继承了A,在类A中有final方法。对类C来讲,调用A的final方法的确是inline编译,即装载在编译时间完成;但对A和B来讲,可能没有调用final方法。而在执行期间,JVM动态装载的方法有可能并不是C所调用的final方法。这种情况下,则不能够取得提高执行速度的结果。当然,如果final方法在编译时间装载到JVM,而且没有在执行期间覆盖的,可以取得inline效益,提高执行速度。
作者建议是:不能仅仅因为考虑追求提高执行速度而使用final类。在程序设计和代码编写时,应首先考虑这个类所执行的任务和安全因素,是否允许有子类。在这个前提下,尽量提高代码的重复应用性是面向对象设计和编程的宗旨。然后考虑是否使用final类和final方法。

点评

兄弟,以后分享的时候 排版排好些  发表于 2014-3-31 17:51

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

3 个回复

正序浏览
赞一个!
回复 使用道具 举报
受教了                    
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马