如何在Java中应用final类

简介:
温故而知新,可以为师矣!( 对所学知识不断复习,不仅可以加深理解,而且可以由此及彼的获得新的知识,就可以做老师了。)

——《论语》

7.6  什么是final

       API 中的某些类,如 String ,以及 Math 等,就是 final 类的典型例子。虽然在 Java 编程中并不经常使用 final 类和 final 方法,但它们有着与众不同的特点,即 final 类不能被继承,不能被覆盖,以及 final 类在执行速度方面比一般类快。下面对 final 类和 final 方法的概念和编程技术分别加以讨论,最后解释为什么 final 类可以提高执行速度。

7.6.1  不能继承final

        有时在程序需要对继承加以限制。例如某些处理特殊运算和操作的类,为了安全理由,不允许被其他类所继承。 final 类没有子类,即它处于继承链的尾部,或者除了自动继承 Object 之外,它们是独立存在的支持类,例如执行密码管理的类,处理数据库信息的管理类等等。
        使用 final 类的另外一个理由是执行速度。由于它的方法不能够被覆盖,所以其地址引用和装载在编译期间完成,而不是在运行期间由 JVM 进行复杂的装载,因而简单和有效。所以如果没有必要,或者不存在有继承的可能性时,尽量使用 final 类。当然,在 API 类库中不多使用 final 类是因为它们是标准程序,希望在实际软件开发中得以广泛使用。而具体的应用软件开发则不同于标准库程序开发。
        注意 final 数据和 final 类的不同。 final 数据指常量,即其值一旦初始化,就不能改变。而 final 类则指不能被其他类所继承的类。

7.6.2  定义final

在类名前加以关键字 final ,这个类就被定义为 final 类,如:

 

public final class SomeClass {
    ...
}

 

或者,

 

public final class SomeClass extends SuperClass {
    ...
}

 

        当一个类被定义为 final 时,它的所有方法都自动成为 final 方法,但不影响对变量的定义。

7.6.3  不能覆盖final方法

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

 

public final String printVersion() {        // 定义 final 方法
    return version;
}

7.6.4  final参数

       final 参数的含义如同 final 变量一样,是常数参数,即当方法接受了这个参数后,其值不能改变。如下代码中定义方法的参数为 final

 

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

 

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

 

version = "other version…";                     // 非法操作

7.6.5  提高执行速度

       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 方法。













本文转自高永强51CTO博客,原文链接: http://blog.51cto.com/yqgao/170194  ,如需转载请自行联系原作者

相关文章
|
1月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
233 3
|
2月前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
232 101
|
2月前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
286 100
|
1月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
87 4
|
1月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
165 5
|
1月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
124 8
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
143 1
|
1月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
203 1
|
1月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
148 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
161 1