👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家
👉Java知识图谱点击链接:体系化学习Java(Java面试专题)
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
1、final 是干什么用的?
➡️final 是一个关键字,用于修饰变量、方法和类。它的作用取决于它所修饰的元素。
2、final 的优缺点
⭐️final 的优点: ⭐️
- 不可变性:final 修饰的变量的值是不可变的,可以保证变量的值不会被修改,从而确保数据的安全性和一致性。
- 安全性:final 修饰的方法和类不能被子类修改或扩展,可以防止不合理的修改和重写,提高代码的安全性。
- 性能优化:final 修饰的变量在编译时会被直接替换为具体的值,避免了变量的访问和计算,提高了代码的执行效率。
⭐️**final 的缺点:**⭐️
- 灵活性受限:final 修饰的变量无法修改,可能会限制程序的灵活性和可扩展性,特别是在需要根据不同情况进行动态变化的场景下。
- 继承限制:final 修饰的方法和类无法被子类重写或继承,这可能会限制代码的扩展性和可维护性,特别是在需要对父类进行修改或扩展的情况下。
- 冗余代码:使用 final 修饰的变量、方法和类在代码中可能会出现多次,可能会导致代码冗余,增加代码的维护成本。
3、final 的应用场景
final 的应用场景有很多,以下是一些常见的应用场景:
- ⭐️常量⭐️:使用 final 修饰的变量可以作为常量,一旦赋值后不可修改。常量通常使用大写字母命名,用于表示不会改变的值,如数学常数、配置参数等。
例如:
final int MAX_VALUE = 100;
final String DATABASE_URL = "jdbc:mysql://localhost:3306/mydb";
- ⭐️方法保护⭐️:使用 final 修饰的方法不能被子类重写或覆盖,可以用于保护关键方法的行为,防止子类对其进行修改。常见的应用场景是在父类中定义一个模板方法,子类只能实现具体的细节方法。
例如:
public abstract class AbstractClass {
public final void templateMethod() {
// 执行一些通用的逻辑
// 调用具体的细节方法
doSomething();
}
protected abstract void doSomething();
}
- ⭐️类的完整性⭐️:使用 final 修饰的类不能被继承,可以用于确保类的完整性和安全性。常见的应用场景是在设计不希望被继承的类时使用 final 修饰。
例如:
public final class UtilityClass {
// 工具类的方法和属性
}
- ⭐️性能优化⭐️:使用 final 修饰的变量在编译时会被直接替换为具体的值,可以避免变量的访问和计算,提高代码的执行效率。特别是在循环中使用 final 修饰不变的循环变量,可以避免重复的计算。
例如:
for (final int i = 0; i < 10; i++) {
// 循环体
}
总之,final 的应用场景包括常量、方法保护、类的完整性和性能优化。通过合理使用 final,可以提高代码的安全性、可维护性和执行效率。
4、final 修饰变量
final 修饰变量时,表示该变量的值不能被修改,即为常量。具体的使用方式是在变量声明时加上 final 关键字,例如:
final int MAX_VALUE = 100;
在上述代码中,MAX_VALUE 被声明为 final 变量,其值为 100,一旦初始化后就不能再被修改。
👉final 修饰的变量必须在声明时进行初始化,可以在声明时直接赋值,也可以在构造函数或初始化块中进行赋值。
👉final 变量一旦被赋值后,其值就不能再被改变。如果试图对 final 变量进行重新赋值,编译器会报错。
👉final 变量一般使用大写字母命名,以便与普通变量区分。在程序中,可以使用 final 变量来定义常量、配置参数等,增加代码的可读性和可维护性。
需要注意的是,final 修饰的是变量的引用,而不是变量指向的对象。如果 final 变量引用的是一个可变对象,那么对象本身是可以修改的,只是变量引用不能再指向其他对象。
总之,final 修饰变量的作用是将其声明为常量,一旦赋值后就不能再被修改。这可以提高代码的可读性和可维护性,并且在某些情况下可以提供性能优化。
5、final 修饰方法
final 修饰方法时,表示该方法不能被子类重写或覆盖。具体的使用方式是在方法声明时加上 final 关键字,例如:
public final void printMessage() {
System.out.println("Hello, World!");
}
在上述代码中,printMessage() 方法被声明为 final 方法,子类不能对该方法进行重写或覆盖。
使用 final 修饰方法有以下几个作用:
👉1. 禁止子类修改方法的实现逻辑,保护关键方法的一致性。这样可以确保方法的行为不会被子类修改,增强代码的可靠性和安全性。
👉2. 提高方法的执行效率。由于 final 方法不能被重写,编译器在编译阶段就可以确定调用的是哪个方法,而不需要在运行时进行动态绑定。这样可以减少方法调用的开销,提高代码的执行效率。
👉3. 在设计模式中,final 方法常常被用作模板方法模式的一部分。通过将关键步骤定义为 final 方法,确保这些步骤的执行顺序和逻辑,而将具体的实现细节留给子类去实现。
需要注意的是,final 修饰的方法只能在当前类中被调用,不能被子类直接调用或重写。同时,final 方法可以被重载,即在同
一个类中可以定义多个具有相同名称但参数列表不同的 final 方法。
总结来说,final 修饰方法可以保护关键方法的一致性,提高执行效率,并在设计模式中发挥重要作用。
6、final 修饰类
final 修饰类时,表示该类不能被继承。具体的使用方式是在类声明时加上 final 关键字,例如:
public final class MyClass {
// 类的成员和方法
}
在上述代码中,MyClass 类被声明为 final 类,意味着不能有其他类继承该类。
使用 final 修饰类有以下几个作用:
👉1. 禁止类被继承,保护类的完整性和稳定性。当一个类的设计已经足够完善,不希望其他类对其进行修改或扩展时,可以将该类声明为 final 类。
👉2. 提高代码的执行效率。由于 final 类不能被继承,编译器在编译阶段就可以对类的方法进行静态绑定,而不需要在运行时进行动态绑定。这样可以减少方法调用的开销,提高代码的执行效率。
👉3. 在某些情况下,final 类可以提供安全性和性能优化。例如,String 类就是一个 final 类,确保字符串对象的不可变性,避免了字符串被修改的风险和开销。
需要注意的是,final 类的成员变量和方法可以是 final 或非 final 的,没有特殊限制。同时,final 类可以使用其他类的对象作为成员变量,只是不能继承其他类。
总结来说,final 修饰类可以保护类的完整性和稳定性,提高执行效率,并在某些情况下提供安全性和性能优化。
💕💕 本文由激流原创,原创不易,感谢支持
💕💕喜欢的话记得点赞收藏啊