java面试 final关键字

final

final关键字的作⽤是什么?

在Java中,final 是一个关键字,用于修饰类、方法和变量。它具有以下不同的作用:

  1. 对于类:表示该类是不可继承的。也就是说,不能再创建该类的子类。

  2. 对于方法:表示该方法是不可重写的。子类不能对该方法进行覆盖,确保了方法的行为不会被修改。

  3. 对于变量:表示该变量是一个常量,它的值一旦被初始化后就不可更改。

    • 对于成员变量:如果一个成员变量被声明为final,则必须在声明时或在构造方法中进行初始化。
    • 对于局部变量:如果一个局部变量被声明为final,则该变量的值在初始化后不能再被修改。

对于基本类型数据(如 intdoubleboolean 等),final 关键字表示该变量的值一旦被初始化后就不能再被修改。例如:

java 复制代码
final int num = 10;

在上述示例中,变量 num 被声明为 final,它的值被初始化为 10,之后不能再修改。

  1. 对于引用类型数据(如类、接口、数组等),final 关键字表示该变量的引用一旦被初始化后就不能够再被修改,但对象本身的状态(内部的属性值)是可以被修改的。例如:

    java 复制代码
    final ArrayList<String> list = new ArrayList<>();
    list.add("Hello");

    在上述示例中,变量 list 被声明为 final,它引用了一个 ArrayList 对象。虽然不能再引用其他对象,但是可以对该对象进行操作,如添加元素到列表中。

    另外,如果 final 关键字修饰的是一个引用类型数据的成员变量,在创建对象时必须将其初始化,或在构造方法中进行赋值操作。

需要注意的是,对于引用类型的 final 变量,虽然其引用不可变,但并不意味着其所指向的对象是不可变的。如果希望对象本身也是不可变的,可以采用其他方式,如使用不可变类或使用 final 修饰类中的成员变量并提供只读方法等。

为什么局部内部类和匿名内部类只能访问局部final变量?

局部内部类和匿名内部类只能访问局部final变量的原因是出于语言设计的考虑,为了确保在内部类的生命周期内,访问的外部变量不被修改。

当一个内部类(包括局部内部类和匿名内部类)被定义在一个方法中时,它可以访问该方法的局部变量。但是,局部变量的生命周期会比方法的执行周期短,当方法执行完毕后,局部变量将会被销毁。

为了保证内部类在其生命周期内可以正常访问到局部变量,Java要求这些局部变量必须是final的或事实上是final的(即声明为final,且没有被重新赋值)。使用final修饰符可以告诉编译器,这个变量的值在内部类中不会发生变化。

这样做有以下几个原因:

  1. 内部类的生命周期可能比外部方法长:如果内部类可以访问非final的局部变量,并且这些变量在外部方法执行结束后发生了改变,那么内部类在之后的使用中就无法获取到正确的值,导致错误的结果。

  2. 编译器的优化:对于final变量,编译器可以在编译时进行优化,直接将局部变量的值传递给内部类,而不需要访问外部变量的引用。这样可以减少内部类的依赖和复杂性。

虽然在Java 8之后,对于局部变量被隐式标记为final的情况,允许在内部类中访问它们,但仍然建议显示地将局部变量声明为final,以增加代码的可读性和可维护性,并避免潜在的问题。

final、finally、finalize 有什么区别?

  1. finalfinal 是一个关键字,用于修饰类、方法和变量

  2. finallyfinally 是一个关键字,用于在异常处理中定义一个代码块。无论是否发生异常,finally 块中的代码都会被执行。finally 通常用于资源释放、清理等操作,以确保在任何情况下都会执行特定的操作。

    java 复制代码
    try {
      // 可能会发生异常的代码块
    } catch (Exception ex) {
      // 异常处理
    } finally {
      // 无论是否发生异常,此处的代码块都会被执行
    }
  3. finalizefinalize 是一个方法,是Java中的一个特殊方法。它是由垃圾回收器在对象被回收之前调用的。

    java 复制代码
    protected void finalize() throws Throwable {
      // 在对象被回收之前执行的代码
    }

    finalize 方法由垃圾回收机制自动调用,通常用于对象的资源释放和清理操作。但是,由于垃圾回收的时机是不确定的,不能保证该方法一定会被调用。在Java 9 及之后的版本中,finalize 已被标记为废弃,不推荐使用。

总结:final 是关键字,用于声明不可变的类、方法和变量;finally 是关键字,用于定义异常处理中的代码块,在无论是否发生异常时都会执行;finalize 是一个方法,由垃圾回收器在对象被回收之前调用。

相关推荐
能摆一天是一天32 分钟前
JAVA stream().flatMap()
java·windows
颜如玉1 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员的世界你不懂3 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年3 小时前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
在未来等你3 小时前
Kafka面试精讲 Day 13:故障检测与自动恢复
大数据·分布式·面试·kafka·消息队列
gb42152873 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
曾经的三心草4 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
Metaphor6924 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word
ChinaRainbowSea4 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
stormsha4 小时前
飞算JavaAI炫技赛电商系统商品管理模块的架构设计与实现
java·架构·鸿蒙系统