特点

final 的含义是最终的、不可改变的。总结了一下 final 的一些规则。

  1. 修饰"类"则类不能被继承,所以没有子类,final类中的方法默认是final的。可以提高效率。JDK中很多加final是这个原因的。编译期确认调哪个方法,所以更快。1.5以后这样做没有效果。
  2. 修饰"方法"则方法不能被重写,
  3. 修饰"成员变量"则变量不以被改变,即被修饰成了常量。只能被赋值一次。
  4. 不能修饰构造方法
  5. 父类中的private成员方法是不能被子类覆盖的,因为private类型的方法默认是隐式final类型的
  6. final 的引用不能指向新的对象。
  7. 形参声明为 final,则方法内不能再改变其:
    1. 基础数据类型值不可被修改
    2. 传入对象不能再被 new
  8. 继承关系时,final 的方法将不会被子类重写。所以父类使用的仍是本类自己的方法。
  9. final 类不可被继承。

C++ 也有final关键字,在C++11及以后的标准中引入了final,final关键字用于修饰类、成员函数和虚函数,表示它们是最终版本,不能被继承或重写。

代码示例

  1. final修饰类:
    当我们使用final关键字修饰一个类时,表示该类是不可继承的。这意味着其他类无法扩展这个被final修饰的类。这通常用于确保类的安全性和完整性。
1
2
3
4
5
6
final class FinalClass {
// 类的内容
}

// 下面的代码会导致编译错误,无法继承FinalClass类
// class SubClass extends FinalClass {}

在上面的示例中,FinalClass被声明为final,因此无法被其他类继承。

2.final修饰方法:

当我们使用final关键字修饰一个方法时,表示该方法不可被子类重写。这主要应用在一些核心方法或者是已经实现完善的方法上,以防止子类对其进行修改。

1
2
3
4
5
6
7
8
9
10
class BaseClass {
// final方法
final void finalMethod() {
// 方法的实现
}
}
class SubClass extends BaseClass {
// 下面的代码会导致编译错误,无法重写finalMethod方法
// void finalMethod() {}
}

在上述示例中,finalMethod被声明为final,因此无法在子类中进行重写。

  1. final修饰变量:
    当我们使用final关键字修饰一个变量时,表示该变量是一个常量,一旦被赋值后就不能再进行修改。这种变量通常被称为"不可变变量"。使用final修饰变量可以提高程序的可读性和安全性,同时还能提供一定程度的性能优化。
1
2
3
4
5
6
7
8
class ImmutableClass {
final int constantValue = 10; // 常量

void modifyValue() {
// 下面的代码会导致编译错误,常量无法被修改
// constantValue = 20;
}
}

在上述示例中,constantValue被声明为final,因此它的值无法被修改。

  1. final与继承:
    当一个类被声明为final时,它不能被其他类继承。这是为了防止其他类对该类进行修改或者破坏。同时,final类的方法默认也是final的,因此无法被子类修改。
  2. final与性能:
    使用final关键字可以带来一些性能上的优化。由于final修饰的方法无法被重写,编译器可以进行方法内联优化,减少方法调用的开销。同样,final修饰的变量在编译时会被直接替换为常量值,避免了变量读取的开销。
  3. final与线程安全:
    在多线程环境下,使用final关键字可以提供一定的线程安全性。当一个对象被声明为final时,它的状态无法改变,从而避免了多线程并发修改的问题。