商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Javafinal关键字用法、场景、面试题全解析

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

  发布于2026-07-19 阅读(0)

扫一扫,手机访问

在Ja va开发里,有一个关键字几乎天天都会碰到,但越是常见的东西,越容易藏着一些容易忽略的细节。没错,说的就是final。表面上看,它只是“最终的、不可修改的”这么简单,但实际用起来,变量、方法、类,三个场景各有各的讲究,新手和老手都容易在这些地方翻车。

这篇文章会从final的三个核心使用场景——修饰变量、修饰方法、修饰类——入手,配合实战代码和容易踩坑的细节,最后再补上几道高频面试题。不管你是刚入门,还是想巩固基础备战面试,读完应该会有收获。

这里先划个重点:final的核心思想是“一旦定义,不可改变”。但注意,这个“不可改变”在不同场景下,含义可是完全不一样的。接下来一个一个说清楚。

一、final关键字核心定义

final是Ja va里一个非访问修饰符,中文意思就是“最终的、不可变的”。它的作用很明确:一是保证代码的安全性,二是提升可读性和可维护性。什么意思呢?就是明确告诉其他人,这个变量、这个方法或者这个类,是不允许被随便动的。

具体来说,final可以修饰三种东西:变量、方法、类。下面逐一拆解。

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

final修饰变量时,含义是“该变量为常量,一旦赋值,无法再修改”。这个“不可修改”要分两种情况来看,基本数据类型和引用数据类型,完全是两码事,也是新手最容易搞混的地方。

2.1 修饰基本数据类型变量

先看基本数据类型,像int、char、double这些。一旦你用final修饰,变量的值就彻底锁死了,再想改?编译器直接报错。

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

2.2 修饰引用数据类型变量

重点来了!final修饰引用类型,比如对象、数组,锁住的是那个“引用地址”——也就是这个变量不能再指向别的对象了。但对象本身内部是怎么样的,它管不着,你可以随便改里面的属性值。

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 常见使用场景(实战必备)

实际开发中,final变量的应用场景其实很广:

  • 定义全局常量:经常搭配static一起用,声明项目中固定不变的值,比如验证码字符池、配置参数;
  • 方法参数:防止方法内部意外修改参数的值,尤其是引用类型参数,避免篡改;
  • 局部变量:明确标识这个变量不会被修改,代码可读性一下子就上去了。

举个实战例子,比如验证码功能:

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

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

说完变量,再来看方法。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("子类重写父类的普通方法");
    }
}

避坑提醒

两个小细节:第一,final方法不能被重写,但可以被重载(重载是方法名相同、参数列表不同,别搞混了);第二,private方法默认就是final的,因为子类根本访问不到,没必要再显式加final。

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

最后来看final修饰类。这个就很好理解了,final类就是“最终类”,不能再被继承。比如Ja va里的String、Math、System,全是final类。

为什么这么设计?要么是类的逻辑已经完整,不需要扩展;要么是为了安全,防止子类继承后篡改核心逻辑。比如String类,如果可以被继承,那字符串常量池的复用机制就可能被破坏,后果很严重。

实战示例

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

重点补充

注意两点:第一,final类里的所有方法,默认都是final的(因为类都不能被继承了,方法自然也没法重写,所以不用再显式加final);第二,final类可以继承别的类,比如String继承自Object,但别人不能继承它。

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

final是面试里的常客,下面这三道题几乎每次都会碰到,建议提前准备好。

面试题1:final、finally、finalize的区别?

  • final:修饰类、方法、变量,核心是“不可修改”,用于保证代码安全和可读性;
  • finally:异常处理的关键字,搭配try-catch使用,无论是否发生异常,finally块里的代码都会执行(除非JVM退出),通常用来释放资源;
  • finalize:Object类里的方法,用于垃圾回收前的资源释放,JVM会自动调用,但开发者几乎用不到,JDK9已经把它标记为废弃了。

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

这个问题其实前面已经说清楚了。final修饰引用变量,限制的是引用地址不能变,也就是变量不能再指向新的对象。但对象本身是独立的,它内部的属性值不受final限制,该改还是能改。

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

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

六、总结(新手必记)

说到这,final的用法基本就讲完了。最后简单总结一下,方便记忆:

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

final是Ja va基础里的重点,也是面试高频考点。建议多写几段代码练练手,尤其是“引用类型变量”的修饰细节,搞清楚了,以后踩坑的概率就小多了。

本文转载于:https://www.jb51.net/program/362192wli.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注