特点
final
的含义是最终的、不可改变的。总结了一下 final 的一些规则。
- 修饰"类"则类不能被继承,所以没有子类,final类中的方法默认是final的。可以提高效率。JDK中很多加final是这个原因的。编译期确认调哪个方法,所以更快。1.5以后这样做没有效果。
- 修饰"方法"则方法不能被重写,
- 修饰"成员变量"则变量不以被改变,即被修饰成了常量。只能被赋值一次。
- 不能修饰构造方法
- 父类中的private成员方法是不能被子类覆盖的,因为private类型的方法默认是隐式final类型的
- final 的引用不能指向新的对象。
- 形参声明为 final,则方法内不能再改变其:
- 基础数据类型值不可被修改
- 传入对象不能再被 new
- 继承关系时,final 的方法将不会被子类重写。所以父类使用的仍是本类自己的方法。
- final 类不可被继承。
C 也有final
关键字,在C 11及以后的标准中引入了final
,final关键字用于修饰类、成员函数和虚函数,表示它们是最终版本,不能被继承或重写。
代码示例
final
修饰类: 当我们使用final
关键字修饰一个类时,表示该类是不可继承的。这意味着其他类无法扩展这个被final
修饰的类。这通常用于确保类的安全性和完整性。
final class FinalClass {
// 类的内容
}
// 下面的代码会导致编译错误,无法继承FinalClass类
// class SubClass extends FinalClass {}
在上面的示例中,FinalClass
被声明为final
,因此无法被其他类继承。
2.final
修饰方法:
当我们使用final
关键字修饰一个方法时,表示该方法不可被子类重写。这主要应用在一些核心方法或者是已经实现完善的方法上,以防止子类对其进行修改。
class BaseClass {
// final方法
final void finalMethod() {
// 方法的实现
}
}
class SubClass extends BaseClass {
// 下面的代码会导致编译错误,无法重写finalMethod方法
// void finalMethod() {}
}
在上述示例中,finalMethod
被声明为final
,因此无法在子类中进行重写。
final
修饰变量: 当我们使用final
关键字修饰一个变量时,表示该变量是一个常量,一旦被赋值后就不能再进行修改。这种变量通常被称为"不可变变量"。使用final
修饰变量可以提高程序的可读性和安全性,同时还能提供一定程度的性能优化。
class ImmutableClass {
final int constantValue = 10; // 常量
void modifyValue() {
// 下面的代码会导致编译错误,常量无法被修改
// constantValue = 20;
}
}
在上述示例中,constantValue
被声明为final
,因此它的值无法被修改。
final
与继承: 当一个类被声明为final
时,它不能被其他类继承。这是为了防止其他类对该类进行修改或者破坏。同时,final
类的方法默认也是final
的,因此无法被子类修改。final
与性能: 使用final
关键字可以带来一些性能上的优化。由于final
修饰的方法无法被重写,编译器可以进行方法内联优化,减少方法调用的开销。同样,final
修饰的变量在编译时会被直接替换为常量值,避免了变量读取的开销。final
与线程安全: 在多线程环境下,使用final
关键字可以提供一定的线程安全性。当一个对象被声明为final
时,它的状态无法改变,从而避免了多线程并发修改的问题。