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

Java 中 final 关键字的作用

引言

在 Java 编程里,final 关键字是一个非常实用且强大的工具。它可以修饰类、方法和变量,赋予这些元素不可改变的特性。深入理解 final 关键字的作用,有助于我们编写出更安全、更高效且易于维护的代码。接下来,我们将详细探讨 final 关键字在不同场景下的具体作用。

final 修饰类

当 final 关键字用于修饰类时,意味着这个类不能被继承,即它不能有子类。这就像是给这个类加上了一把 “锁”,阻止其他类对它进行扩展。

示例代码

final class FinalClass {
    public void showMessage() {
        System.out.println("This is a final class.");
    }
}

// 以下代码会编译错误,因为 FinalClass 是 final 类,不能被继承
// class SubClass extends FinalClass {
// }

使用场景

  • 安全性和稳定性:当一个类的设计已经非常完善,不希望其他开发者通过继承来修改其行为时,可以将其声明为 final 类。例如,Java 中的 String 类就是 final 类,这保证了字符串的不可变性和安全性,防止他人通过继承修改字符串的行为,从而避免潜在的安全风险。
  • 性能优化:由于 final 类不能被继承,编译器可以对其进行一些优化,提高代码的执行效率。

final 修饰方法

当 final 关键字用于修饰方法时,这个方法不能被其子类重写。这就像是给这个方法设置了一个 “保护罩”,确保其实现不会被改变。

示例代码

class ParentClass {
    public final void display() {
        System.out.println("This is a final method.");
    }
}

class ChildClass extends ParentClass {
    // 以下代码会编译错误,因为 display 方法是 final 方法,不能被重写
    // @Override
    // public void display() {
    //     System.out.println("Trying to override final method.");
    // }
}

使用场景

  • 确保方法的一致性:当一个方法的实现逻辑是固定的,不希望子类对其进行修改时,可以将其声明为 final 方法。例如,一些基础的工具方法,其实现逻辑已经经过严格测试和验证,不允许子类随意改变。
  • 提高性能final 方法在调用时不需要进行动态绑定,编译器可以直接确定调用的方法,从而提高方法调用的效率。

final 修饰变量

当 final 关键字用于修饰变量时,这个变量一旦被赋值,就不能再被修改,成为了一个常量。

修饰基本数据类型变量

final int MAX_NUMBER = 100;
// 以下代码会编译错误,因为 MAX_NUMBER 是 final 变量,不能再被赋值
// MAX_NUMBER = 200;

当 final 修饰基本数据类型变量时,变量存储的值不能被改变。

修饰引用数据类型变量

import java.util.ArrayList;
import java.util.List;

public class FinalReferenceExample {
    public static void main(String[] args) {
        final List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");

        // 以下代码会编译错误,因为 list 是 final 变量,不能再指向其他对象
        // list = new ArrayList<>();
    }
}

当 final 修饰引用数据类型变量时,变量存储的引用地址不能被改变,但对象本身的内容是可以修改的。

使用场景

  • 常量定义:在程序中,经常会用到一些固定不变的值,如圆周率、数学常量等,使用 final 关键字将其定义为常量,提高代码的可读性和可维护性。
public class Constants {
    public static final double PI = 3.1415926;
}

  • 避免意外修改:使用 final 关键字可以防止变量在代码中被意外修改,增强代码的安全性。

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

相关文章:

  • LeetCode2506
  • Java 面试篇-MySQL 专题(如何定位慢查询、如何分析 SQL 语句、索引底层数据结构、什么是聚簇索引?什么是非聚簇索引?知道什么是回表查询?什么是覆盖索引?事务的特性、并发事务带来的问题?)
  • 答题卡识别阅卷系统(Matlab)
  • sklearn中的决策树-分类树:重要参数
  • 本地化部署 DeepSeek:从零到一的完整指南
  • DeepSeek03-ollama本地部署DeepSeek(NSFW)
  • leetcode 题目解析 第3题 无重复字符的最长子串
  • 标准I/O与文件I/O
  • 【DeepSeek-R1背后的技术】系列八:位置编码介绍(绝对位置编码、RoPE、ALiBi、YaRN)
  • Spring MVC 对象转换器:初级开发者入门指南
  • 【跟我学YOLO】(1)YOLO12:以注意力为中心的物体检测
  • 简聊RocketMQ如何确保顺序性
  • HADOOP_HOME and hadoop.home.dir are unset.
  • php处理图片出现内存溢出(Allowed memory size of 134217728 bytes exhausted)
  • 【网络编程】服务器模型(二):并发服务器模型(多线程)和 I/O 复用服务器(select / epoll)
  • 【多语言生态篇四】【DeepSeek×Rust:安全内存管理实践】
  • verilog笔记
  • 【Leetcode 每日一题 - 扩展】1512. 好数对的数目
  • C语言实现的常见算法示例
  • 【算法】直接插入排序、折半插入排序、希尔排序