在Java编程语言中,final是一个用途广泛的关键字,它可以修饰变量、方法和类,不同场景下的作用差异较大,理解这些用法能帮助开发者写出更可靠的程序。

final修饰变量
当final修饰变量时,根据变量类型的不同,作用会有所区别:
修饰基本数据类型变量
final修饰基本数据类型变量后,该变量的值一旦被赋值就无法再修改,相当于定义了一个常量。
public class FinalDemo {
// 成员变量,必须在声明时或构造器中赋值
private final int num = 10;
// 静态final变量,属于类常量,通常大写命名
public static final String APP_NAME = "demo";
public void test() {
// 局部final变量,使用前赋值即可
final int localNum;
localNum = 20;
// 以下代码会编译报错,final变量无法重新赋值
// localNum = 30;
}
}
修饰引用数据类型变量
final修饰引用类型变量时,限制的是引用本身不能指向其他对象,但是对象内部的内容是可以修改的。
import java.util.ArrayList;
import java.util.List;
public class FinalRefDemo {
public static void main(String[] args) {
final List<String> list = new ArrayList<>();
// 可以修改list内部元素
list.add("hello");
list.add("world");
// 以下代码会编译报错,引用不能指向新的对象
// list = new ArrayList<>();
System.out.println(list);
}
}
final修饰方法
final修饰方法有两个主要作用:一是防止方法被重写,二是早期Java版本中可以用来提升方法调用效率,不过现在JVM已经可以自动优化,这个作用已经不明显了。
class Parent {
// final方法不能被子类重写
public final void printInfo() {
System.out.println("parent info");
}
}
class Child extends Parent {
// 以下代码会编译报错,无法重写final方法
// @Override
// public void printInfo() {
// System.out.println("child info");
// }
}
final修饰类
final修饰的类无法被继承,类中的所有方法都会隐式地变成final方法,常见的比如Java中的String类就是final修饰的。
// final类不能被继承
final class FinalClass {
public void test() {
System.out.println("final class method");
}
}
// 以下代码会编译报错,无法继承final类
// class SubClass extends FinalClass {
// }
final的注意事项
- final修饰的成员变量必须在声明时、构造代码块或者构造器中完成赋值,否则会编译报错
- final和static搭配使用时,通常用来定义全局常量,命名规范是全大写加下划线
- 在多线程场景下,final修饰的变量可以保证可见性,不需要额外的同步措施就能让其他线程看到初始化后的值
- 不要为了限制方法重写就随意使用final修饰方法,只有当方法逻辑确定不需要被扩展时才使用
final关键字的核心作用是限制被修饰元素的不可变性,合理使用可以提升代码的安全性和可维护性,减少不必要的修改带来的问题。
通过上述不同场景的用法说明,开发者可以根据实际需求选择合适的final使用方式,在平时的编码中多留意final的适用场景,能写出更健壮的Java程序。
finalJavafinal_variablefinal_methodfinal_class修改时间:2026-06-20 06:09:25