当前位置: 首页 > article >正文

Java 中 final 关键字的奥秘

目录

一、final 修饰类:封印的 “永恒之石”

二、final 修饰变量:锁定的 “不变之值”

三、final 修饰方法:不可撼动的 “坚固堡垒”

四、总结


在 Java 编程的世界里,final 关键字就像一把神奇的 “锁”,一旦使用,就能赋予类、变量和方法独特的性质。今天,就让我们一同深入探究 final 关键字修饰类、变量和方法时的各种表现和用途,通过丰富的代码示例,感受它为我们的编程带来的便利与保障。

一、final 修饰类:封印的 “永恒之石”

当 final 关键字修饰一个类时,这个类就如同被封印的 “永恒之石”,无法被其他类继承。这意味着该类的设计和功能已经固定,不希望被修改或扩展。在实际应用中,这样的类通常用于表示那些具有特定用途、不需要也不应该被改变的实体。

比如,Java 标准库中的String类就是一个被 final 修饰的类。String类用于处理字符串,它的内部实现已经非常完善,并且在各种场景下都被广泛使用。如果允许其他类继承String类,可能会破坏String类的一些特性和安全性。

下面我们通过自定义一个被 final 修饰的类来加深理解:

final class ImmutablePoint {
    private int x;
    private int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

在这个例子中,ImmutablePoint类被 final 修饰,它表示一个不可变的点。由于不能被继承,我们可以确保这个类的行为和属性不会被意外修改。如果尝试创建一个继承自ImmutablePoint的类,将会导致编译错误:

// 以下代码会导致编译错误,因为ImmutablePoint类被final修饰,不能被继承
// class SubImmutablePoint extends ImmutablePoint {
//     // 类体
// }

final 修饰类在保证代码的稳定性和安全性方面具有重要意义,尤其在一些基础类库的设计中,能防止子类对核心功能的破坏。

二、final 修饰变量:锁定的 “不变之值”

  1. final 修饰基本数据类型变量
    当 final 修饰基本数据类型变量时,该变量就成为一个常量,一旦被赋值,其值就不能再被改变。这在很多场景下非常有用,比如定义数学常量、配置参数等。

public class MathConstants {
    public static final double PI = 3.141592653589793;
    public static final int E = 2.71828;

    public static void main(String[] args) {
        // 以下代码会导致编译错误,因为PI是final修饰的常量,不能被重新赋值
        // PI = 3.14;
        System.out.println("圆周率PI的值为: " + PI);
        System.out.println("自然常数E的值为: " + E);
    }
}

在这个例子中,PIE都是被 final 修饰的常量,它们的值在程序运行过程中始终保持不变。使用 final 修饰常量,不仅可以提高代码的可读性,还能避免因意外赋值导致的错误。
2. final 修饰引用数据类型变量
当 final 修饰引用数据类型变量时,它表示该变量的引用不能再指向其他对象,但对象本身的内容是可以修改的。这一点需要特别注意,与基本数据类型变量有所不同。

class MutableObject {
    private int value;

    public MutableObject(int value) {
        this.value = value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

public class FinalReferenceExample {
    public static void main(String[] args) {
        final MutableObject obj = new MutableObject(10);
        // 以下代码会导致编译错误,因为obj是final修饰的变量,不能再指向其他对象
        // obj = new MutableObject(20);
        obj.setValue(30);
        System.out.println("对象的值为: " + obj.getValue());
    }
}

在这个例子中,obj是一个被 final 修饰的引用变量,它只能指向创建时的MutableObject对象,不能再指向其他对象。但是,我们可以通过调用对象的方法修改对象内部的状态,如obj.setValue(30)

三、final 修饰方法:不可撼动的 “坚固堡垒”

当 final 修饰一个方法时,该方法就不能被其子类重写。这在设计类的方法时非常有用,如果你希望某个方法的实现是固定的,不希望子类对其进行修改,可以将该方法声明为 final。

class Animal {
    public final void makeSound() {
        System.out.println("动物发出声音");
    }
}

class Dog extends Animal {
    // 以下代码会导致编译错误,因为makeSound方法在父类中被final修饰,不能被重写
    // @Override
    // public void makeSound() {
    //     System.out.println("汪汪汪");
    // }
}

在这个例子中,Animal类中的makeSound方法被 final 修饰,Dog类作为Animal类的子类,不能重写makeSound方法。这确保了在继承体系中,makeSound方法的行为始终保持一致。

final 修饰方法在很多情况下可以提高程序的安全性和稳定性。例如,在一些核心算法的实现中,将关键方法声明为 final,可以防止子类无意中修改算法逻辑,导致程序出现错误。

四、总结

通过以上对 final 关键字修饰类、变量和方法的深入探讨,我们可以看到 final 关键字在 Java 编程中扮演着重要的角色。它为我们提供了一种机制,能够确保类的设计、变量的值以及方法的实现保持稳定和不变。合理使用 final 关键字,可以使我们的代码更加健壮、安全和易于维护。在实际编程中,我们需要根据具体的业务需求和设计目标,灵活运用 final 关键字,发挥它的最大优势。希望大家在今后的 Java 编程中,能够熟练掌握和运用 final 关键字,创造出更加优秀的程序。如果在学习过程中遇到任何问题,欢迎随时与我交流,让我们一起在 Java 编程的道路上不断前行。


http://www.kler.cn/a/514450.html

相关文章:

  • qml OpacityMask详解
  • vscode导入模块不显示类型注解
  • 以单用户模式启动 Linux 的方法
  • MYSQL数据库基础-01.数据库的基本操作
  • Day 14 卡玛笔记
  • Linux TCP 之 RTT 采集与 RTO 计算
  • 锐捷路由器网关RG-NBR6135-E和锐捷交换机 Ruijie Reyee RG-ES224GC 电脑登录web方法
  • IDEA导入Maven工程不识别pom.xml
  • 5G/4G+北斗三号水利遥测终端机RTU-打造水利工程的智能核心
  • Azure面试
  • PHP语言的语法糖
  • Java 设计模式 二 单例模式 (Singleton Pattern)
  • STM32学习9---EXIT外部中断(理论)
  • qiankun+vite+vue3
  • spring security StackOverflowError 问题解决
  • 腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发
  • Nginx部署Vue项目添加访问后缀
  • LDN的蓝牙双模键盘帮助文档
  • pytorch 多机多卡训练方法
  • 数据恢复常用方法(三)如何辨别固态硬盘故障类型
  • 蓝桥杯 单词重排
  • 鸿蒙Flutter实战:17-无痛上架审核指南
  • NPM简介
  • Linux计划任务(crontab)
  • Node.js接收文件分片数据并进行合并处理
  • 【cuda学习日记】3.2 CUDA执行模型--并行归约问题