博客
关于我
重新精读《Java 编程思想》系列之final关键字
阅读量:433 次
发布时间:2019-03-06

本文共 1870 字,大约阅读时间需要 6 分钟。

Java中的final关键字:深入理解与应用

在Java编程中,final 是一个非常重要的关键字,它用于修饰数据、方法和类,确保这些元素在编译时被标记为不可变。了解如何正确使用final关键字,可以帮助开发者更好地设计可靠且高效的Java程序。

final数据

final 用于修饰数据,表示这些数据在程序运行期间保持恒定不变。数据可以分为两类:

  • 编译时常量

    编译器可以在程序运行前计算并替换这些值,例如:

    public static final int MAX_VALUE = 100;

    这些常量通常用于性能优化,因为它们可以在编译时直接代入计算式,减少运行时的计算开销。

  • 运行时初始化值

    这些值在程序运行时被初始化,但在运行时不能被修改。例如:

    public final int age;

    在类构造器中必须对其进行初始化,否则会引发编译错误。

  • 需要注意的是,final修饰的对象引用是不可变的,但对象本身的状态可以改变。例如:

    public static final SomeObject obj = new SomeObject();// obj的引用不能再改变,但obj中的属性可以修改。

    空白final

    Java允许定义未赋值的空白final,这种情况下,编译器会确保在使用前空白final被正确初始化。这种机制可以在保持数据不变的同时,允许在运行时根据具体情况进行调整。

    例如:

    public class Poppet {    private int i;    Poppet(int ii) {        i = ii;    }}public class BlankFinal {    private final int i = 0; // 空白final已赋值    private final int j;    // 空白final未赋值    private final Poppet p;    public BlankFinal() {        j = 1;        p = new Poppet(1);    }    public BlankFinal(int x) {        j = x;        p = new Poppet(x);    }    public static void main(String[] args) {        new BlankFinal();        new BlankFinal(20);    }}

    在构造器中必须对空白final进行初始化,否则会引发编译错误。

    final参数

    在Java中,方法参数可以被声明为final,这意味着在方法内部不能修改参数引用指向的对象,但可以读取其值。例如:

    void with(final Gizmo g) {    // g不能被修改,但可以访问其属性}

    需要注意的是,final参数的引用是不可变的,但参数本身可以是基本数据类型或对象。如果是基本数据类型,参数可以是不可变的,例如:

    void f(final int i) {    i++; // 不允许,编译器会报错}

    但如果是对象,可以是可变的,但其引用不能被修改。

    final方法

    final 方法的主要作用有两个:

  • 防止方法被覆盖

    如果一个方法被声明为final,继承类将无法覆盖该方法的实现,确保方法行为保持不变。

  • 性能优化

    在早期Java版本中,final方法可以被内嵌,这样可以减少方法调用的开销。但在现代Java中,这种优化通常由虚拟机自动处理。

  • 需要注意的是,final方法可以是静态或动态方法,具体取决于定义的位置。

    final与private关键字

    类中的所有private方法都隐式地被声明为final,因为没有其他类可以访问这些方法,从而无法覆盖它们。虽然可以在private方法中手动添加final修饰符,但这没有任何实际意义。

    final类

    将一个类声明为final,表示该类不可被继承,确保类及其内部的状态不会发生变化。final类中的域可以选择是否为final,具体取决于需求。

    需要注意的是,final类的方法都是隐式的final,无法被覆盖。

    总结

    通过对Java中的final关键字的深入理解,可以更好地设计和优化Java程序。无论是修饰数据、方法还是类,final都为程序带来了安全性和性能优势。在实际编程中,合理使用final关键字,可以帮助开发者创建更高效、更可靠的代码。

    转载地址:http://geuyz.baihongyu.com/

    你可能感兴趣的文章
    openlayers 入门教程(四):layers 篇
    查看>>
    OpenLayers 项目分析(三)-OpenLayers中定制JavaScript内置类
    查看>>
    Openlayers下载与加载geoserver的wms服务显示地图
    查看>>
    Openlayers中使用Cluster+Overlay实现点击单个要素和聚合要素时显示不同弹窗
    查看>>
    Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
    查看>>
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动
    查看>>
    Vmware系列&虚拟机系列【仅供参考】:使用vCenter Auto Deploy制作ESXI系统封装(适合高版本vSphere)
    查看>>
    Openlayers中加载GeoJson文件显示地图
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示
    查看>>
    Openlayers中多图层遮挡时调整图层上下顺序
    查看>>
    Openlayers中实现地图上添加一条红色直线
    查看>>
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    Openlayers入门教程 --- 万字长篇
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    OpenLayers学习三:地图旋转及地图跳转到某一点的方式(以类为接口)
    查看>>