Java final关键字用法、场景、面试题全解析

 更新时间:2026年04月15日 08:57:59   作者:海寻山  
本文全程围绕final的核心用法展开,从“修饰变量、修饰方法、修饰类”三个核心场景,搭配实战代码、避坑细节,再补充高频面试题,帮你彻底吃透final,既适合新手入门,也适合巩固基础、备战面试,感兴趣的朋友一起看看吧

哈喽,各位Java学习者!今天咱们拆解一个Java中高频且核心的关键字——final。它看似简单,仅表示“最终的、不可修改的”,但在实际开发和面试中都高频出现,稍不注意就会踩坑。

本文全程围绕final的核心用法展开,从“修饰变量、修饰方法、修饰类”三个核心场景,搭配实战代码、避坑细节,再补充高频面试题,帮你彻底吃透final,既适合新手入门,也适合巩固基础、备战面试,建议收藏备用~

核心提示:final的核心思想是“一旦定义,不可改变”,但不同修饰对象(变量、方法、类)的“不可改变”含义不同,这是新手最容易混淆的点,一定要重点区分。

一、final关键字核心定义

final是Java中的一个非访问修饰符,中文意为“最终的、不可变的”,用于限制类、方法、变量的可修改性,核心作用有两个:

  • 保证代码的安全性:防止类被继承、方法被重写、变量被篡改,避免意外修改导致的bug;
  • 提高代码的可读性和可维护性:明确标识“不可修改”的元素,让开发者一眼知晓其作用域和限制。

final可修饰的三种对象,也是本文的核心重点:变量、方法、类,下面逐一详解。

二、final修饰变量(最常用,重点掌握)

final修饰变量时,含义是“该变量为常量,一旦赋值,无法再修改”。这里的“无法修改”,需区分“基本数据类型”和“引用数据类型”,这是新手最容易踩坑的点。

2.1 修饰基本数据类型变量

修饰基本数据类型(int、char、double等)时,变量的值一旦赋值,就无法更改,直接编译报错。

public class FinalVariableDemo {
    public static void main(String[] args) {
        // 1. 局部变量(方法内):声明时直接赋值
        final int MAX_AGE = 120; // 常量命名规范:全大写,单词间用下划线分隔
        // MAX_AGE = 130; // 编译报错:无法为最终变量分配值
        // 2. 成员变量(类内、方法外):两种赋值方式,二选一
        final String NAME = "Java学习者"; // 方式1:声明时直接赋值
        final int SCORE; // 方式2:构造器中赋值(必须赋值,否则编译报错)
        // 构造器赋值
        SCORE = 95;
        // SCORE = 100; // 编译报错:已赋值,无法修改
    }
}

2.2 修饰引用数据类型变量

重点!修饰引用数据类型(对象、数组等)时,不可修改的是“引用地址”,而非对象内部的属性值。也就是说,引用变量不能指向新的对象,但可以修改对象内部的成员变量。

public class FinalReferenceDemo {
    public static void main(String[] args) {
        // final修饰数组(引用类型)
        final int[] ARR = {1, 2, 3};
        ARR[0] = 100; // 允许:修改数组内部元素的值
        // ARR = new int[]{4,5,6}; // 编译报错:无法修改引用地址
        // final修饰对象(引用类型)
        final Person person = new Person("张三", 20);
        person.setAge(21); // 允许:修改对象内部属性
        // person = new Person("李四", 22); // 编译报错:无法修改引用地址
    }
}
// 自定义Person类
class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // setter方法:修改对象内部属性
    public void setAge(int age) {
        this.age = age;
    }
}

2.3 常见使用场景(实战必备)

  • 定义全局常量:搭配static使用,声明项目中固定不变的值(如验证码字符池、配置参数);
  • 方法参数:防止方法内部修改参数的值(尤其是引用类型参数,避免意外篡改);
  • 局部变量:明确标识该变量不会被修改,提高代码可读性(如循环次数、固定阈值)。

实战示例(结合验证码功能):

// 全局常量:验证码字符池(固定不变,用final+static修饰)
public static final String CODE_POOL = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 全局常量:验证码固定长度(不可修改)
public static final int CODE_LENGTH = 4;

三、final修饰方法(面试高频)

final修饰方法时,含义是“该方法不能被子类重写”,但可以被子类继承和调用。

核心使用场景:父类的方法逻辑已经固定,不希望子类修改该方法的实现(比如工具类的核心方法、通用逻辑方法),避免子类重写后破坏父类的设计意图。

实战示例

// 父类
class Parent {
    // final修饰方法,不能被子类重写
    public final void showInfo() {
        System.out.println("父类的固定逻辑,不可修改");
    }
    // 普通方法,可被子类重写
    public void commonMethod() {
        System.out.println("父类的普通方法");
    }
}
// 子类
class Son extends Parent {
    // 报错:Cannot override the final method from Parent
    // @Override
    // public void showInfo() {}
    // 允许:重写普通方法
    @Override
    public void commonMethod() {
        System.out.println("子类重写父类的普通方法");
    }
}

避坑提醒

1. final方法不能被重写,但可以被重载(重载和重写不同,重载是方法名相同、参数列表不同);

2. private方法默认是final的(子类无法访问,自然无法重写),无需显式添加final修饰。

四、final修饰类(实战常用)

final修饰类时,含义是“该类不能被继承”,即该类没有子类,是一个“最终类”。

核心使用场景:类的逻辑已经完整,不需要被扩展,或者为了安全,防止子类继承后篡改核心逻辑(比如Java中的String、Math、System类,都是final类)。

实战示例

// final修饰类,不能被继承
final class FinalClass {
    public void show() {
        System.out.println("final类的方法");
    }
}
// 报错:Cannot inherit from final class FinalClass
// class SubClass extends FinalClass {}

重点补充

1. final类中的所有方法,默认都是final方法(因为类不能被继承,方法自然无法被重写,无需显式添加final);

2. final类可以继承其他类,但不能被其他类继承(比如String类继承自Object类,但不能被我们自定义的类继承)。

五、final高频面试题(新手必背)

final是面试中的高频考点,以下3道题几乎是必问,建议牢记答案,避免踩坑。

面试题1:final、finally、finalize的区别?(最常考)

  • final:修饰类、方法、变量,核心是“不可修改”,用于保证代码安全和可读性;
  • finally:异常处理的关键字,搭配try-catch使用,无论是否发生异常,finally块中的代码都会执行(除非JVM退出),常用于释放资源;
  • finalize:Object类中的方法,用于垃圾回收前的资源释放(比如关闭文件、释放连接),JVM会自动调用,开发者几乎不用手动调用(已被JDK9废弃)。

面试题2:final修饰引用类型变量,为什么能修改对象内部的属性?

final修饰引用变量,限制的是“引用地址”不可修改(即不能指向新的对象),但对象本身是独立的,其内部的属性值不受final限制,可通过setter方法或直接赋值修改。

面试题3:String类为什么是final的?

核心原因有两个:

  • 安全性:防止String类被继承后篡改核心逻辑,避免字符串内容被意外修改(比如黑客篡改密码、接口参数等);
  • 效率:String类实现了常量池,final修饰保证字符串不可变,才能实现常量池复用,提高程序运行效率。

六、总结(新手必记)

final关键字的核心是“不可修改”,但不同修饰对象的含义不同,总结如下:

  • 修饰变量:基本类型→值不可改;引用类型→地址不可改,对象内容可改;
  • 修饰方法:不可被子类重写,可继承、可重载;
  • 修饰类:不可被继承,类中方法默认是final;
  • 高频搭配:static+final→全局常量,项目中大量使用;
  • 核心作用:保证代码安全、提高可读性和可维护性。

final是Java基础中的重点,也是面试高频考点,建议多写代码练习,重点区分“引用类型变量”的修饰细节,避免踩坑。

到此这篇关于Java final关键字用法、场景、面试题全解析的文章就介绍到这了,更多相关Java final关键字用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot JPA级联操作的实现(一对一、一对多、多对多)

    Springboot JPA级联操作的实现(一对一、一对多、多对多)

    本文深入解析JPA中的一对一、一对多和多对多级联操作,包括实体间的关系建立、查询、保存、刷新和删除等操作,具有一定的参考价值,感兴趣的可以了解一下
    2025-07-07
  • Java如何实现封装和包

    Java如何实现封装和包

    文章主要介绍了Java中的封装、访问修饰符、封装的好处、封装的步骤、包的概念、导入包、自定义包、常用的包、static关键字及其用法、代码块、对象的打印等内容
    2026-01-01
  • JDBC 与 MyBatis从基础到实践

    JDBC 与 MyBatis从基础到实践

    JDBC(Java Database Connectivity)即 Java 数据库连接,是 Java 语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法,这篇文章主要介绍了JDBC 与 MyBatis从基础到实践,需要的朋友可以参考下
    2025-04-04
  • Java JAR 启动内存参数配置指南(从基础设置到性能优化)

    Java JAR 启动内存参数配置指南(从基础设置到性能优化)

    在启动 Java 可执行 JAR 文件时,合理配置 JVM 内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式指定内存配置,并结合实际场景提供优化建议,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • maven在settings.xml和pom.xml中指定jdk版本编译的方法

    maven在settings.xml和pom.xml中指定jdk版本编译的方法

    在开发Java应用时,通常需要指定要使用的Java版本,下面这篇文章主要给大家介绍了关于maven在settings.xm和pom.xml中指定jdk版本编译的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • JVM要双亲委派的原因及如何打破它

    JVM要双亲委派的原因及如何打破它

    平时做业务开发比较少接触类加载器,但是如果想深入学习,了解类加载的原理是必不可少的.java的类加载器有哪些?什么是双亲委派?为什么要双亲委派?如何打破它?接下来本文就带大家详细介绍这些知识 ,需要的朋友可以参考下
    2021-06-06
  • java实现导出数据为zip压缩文件

    java实现导出数据为zip压缩文件

    这篇文章主要为大家详细介绍了java如何实现导出数据为zip压缩文件,并且解压后为json文件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • java并发编程之cas详解

    java并发编程之cas详解

    这篇文章主要介绍了java并发编程之cas详解,涉及cas使用场景和cas用作原子操作等内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java线程基本使用之如何实现Runnable接口

    Java线程基本使用之如何实现Runnable接口

    这篇文章主要介绍了Java线程基本使用之如何实现Runnable接口问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringBoot应用优雅停机的3种标准方案

    SpringBoot应用优雅停机的3种标准方案

    所谓优雅停机(Graceful Shutdown),就是让应用在关闭前停止接收新请求;把正在处理的请求执行完;释放线程池、连接池、MQ 消费者等资源;最后再安全退出,今天讲清楚 SpringBoot优雅停机的3种标准方案,生产直接抄配置,需要的朋友可以参考下
    2026-03-03

最新评论