- 修饰方法
- 功能和目的:当一个方法被
final
修饰时,它不能在子类中被重写。这确保了该方法的实现在继承层次结构中保持不变,对于一些核心的业务逻辑方法或者不希望被子类改变行为的方法非常有用。例如,在一个数学计算工具类中,有一个计算圆面积的方法calculateCircleArea
,为了保证计算方法的准确性和一致性,不希望子类去改变这个方法的实现,就可以将其声明为final
。 - 示例代码:
class MathUtils { public final double calculateCircleArea(double radius) { return Math.PI * radius * radius; } } class SubMathUtils extends MathUtils { // 以下代码会导致编译错误,因为不能重写final方法 // public double calculateCircleArea(double radius) { // return 0; // } }
- 功能和目的:当一个方法被
- 修饰类
- 功能和目的:
final
修饰类表示该类不能被继承。这在设计一些具有固定功能和结构的类时很有用,比如一些提供底层系统服务的类或者只是作为数据载体的类(如Java中的String
类),不希望其他类去扩展它们,以避免对其内部逻辑的干扰。另外,对于一些安全相关的类,通过将其声明为final
可以防止恶意继承和篡改。 - 示例代码:
// 定义一个final类 final class ImmutablePoint { private final int x; private final int y; public ImmutablePoint(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } } // 以下代码会导致编译错误,因为不能继承final类 // class SubImmutablePoint extends ImmutablePoint { // }
- 功能和目的:
- 修饰引用(包括数组引用)
- 功能和目的:当
final
修饰引用时,引用本身不能被重新赋值,但引用所指向的对象的内容(如果是可变对象)可以被修改。这在处理一些需要固定引用但允许对象内部状态变化的情况时很有用。例如,在一个缓存系统中,缓存的键值对存储结构的引用可能需要保持不变,但其中存储的值对象(如果是可变的)可以根据业务逻辑进行更新。 - 示例代码 - 基本类型数组引用:
final int[] finalArray = { 1, 2, 3}; // 以下代码会导致编译错误,因为不能重新赋值final引用 // finalArray = new int[]{4, 5, 6}; // 但是可以修改数组元素的值 finalArray[0] = 4;
- 示例代码 - 对象数组引用:
class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } final Person[] finalPersonArray = new Person[2]; finalPersonArray[0] = new Person("Alice"); // 以下代码会导致编译错误,因为不能重新赋值final引用 // finalPersonArray = new Person[3]; // 但是可以修改数组元素(对象)的内部状态 finalPersonArray[0].setName("Bob");
- 功能和目的:当