整理好了!2024年最常见 100 道 Java基础面试题(十一)

上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(十)-CSDN博客

二十一、final 关键字有哪些用法?

final关键字在Java中有几个不同的用途:

  1. 最终变量: 当用final修饰一个变量时,这个变量变成了常量,它的值在初始化之后不能被改变。对于基本数据类型,这意味着变量的值不能被修改;对于对象,这意味着变量引用不能指向另一个对象,但对象内部的状态可以被修改(除非对象本身被声明为不可变)。

    final int MY_FINAL_VAR = 10; // 这个变量的值在初始化后不能被改变
  2. 最终方法final方法不能被子类覆盖。它用于定义没有特殊原因不应该被改变的方法。这可以用来限制行为的扩展,或者当设计者认为方法的实现已经足够好,不应该被修改时。

    public final void myFinalMethod() {
        // 方法体
    }
  3. 最终类: 用final修饰的类不能被继承。这意味着没有任何其他类可以从这个类派生。最终类可以用来表示一个类是不可扩展的,这在设计一个不会改变的框架或库时很有用。

    public final class MyFinalClass {
        // 类体
    }
  4. 局部变量的优化(常量抓取): 在编译时,Java编译器可能会将final的局部变量提升到一个更大的作用域,这被称为“常量抓取”。这意味着,即使在方法内部声明了final变量,它也可能在编译后被存储在一个类级别的区域,从而减少对栈的访问。

  5. 匿名内部类中的实例变量: 在匿名内部类中,如果一个实例变量被声明为final,它可以在匿名类中被使用,因为匿名内部类不能访问外部类的局部变量。

    final int outerVar = 10;
    new Thread(new Runnable() {
        public void run() {
            System.out.println(outerVar); // 可以访问final的外部变量
        }
    }).start();
  6. 泛型中的类型参数: 在泛型中,可以使用final来防止类型参数被扩展或实现。

    public <final T> void myMethod() {
        // T不能是任何泛型类型的子类型
    }

final关键字是Java中一个非常重要的修饰符,它可以用来创建不可变的对象、限制继承、防止方法被覆盖以及优化编译器的内部实现。正确使用final可以提高代码的安全性和性能,并帮助开发者表达代码的意图。

二十二、final、finally、finalize 有什么区别?

这三个关键字虽然拼写相似,但它们在Java中扮演着完全不同的角色:

  1. final 关键字

    • final 用于声明一个不可变的实体。它可以修饰变量(成为常量)、方法(不能被重写)和类(不能被继承)。
    • 当变量被声明为 final 时,它必须在声明时或构造函数中初始化,且之后不能被重新赋值。
    • 对于方法,final 关键字阻止子类重写该方法。
    • 对于类,final 关键字表示该类不能有子类,即不能被继承。
    public final class MyClass {
        private final int myFinalField = 0; // final变量
    
        public final void myFinalMethod() {} // final方法
    }
  2. finally 关键字

    • finally 是与 try-catch-finally 语句块一起使用的,用于异常处理。它指定了一段代码,这段代码在 try 块和 catch 块执行完毕后必定会执行,无论是否发生异常。
    • finally 块常用于执行清理工作,如关闭文件流、释放资源等。
    try {
        // 可能会抛出异常的代码
    } catch (Exception e) {
        // 异常处理代码
    } finally {
        // 一定会执行的代码,通常用于资源清理
    }
  3. finalize 方法

    • finalize 是 java.lang.Object 类的一个受保护方法,它在对象被垃圾收集器回收前由JVM自动调用。
    • finalize 方法可以被子类重写,用于在对象被回收时进行资源清理工作,如关闭文件、释放数据库连接等。
    • 由于垃圾收集器的调用时机不确定,以及从Java 9开始,finalize 方法被标记为过时(deprecated),通常推荐使用 try-finally 块或自动关闭资源的 AutoCloseable 接口来管理资源。
public class MyClass {
    protected void finalize() throws Throwable {
        super.finalize();
        // 清理代码
    }
}

总结来说,final 关键字用于声明不可变的实体,finally 关键字用于异常处理,确保某些代码一定会执行,而 finalize 是一个方法,用于在对象被垃圾收集器回收前进行清理工作。尽管它们在语法上有相似之处,但它们的用途和行为完全不同。

  • 26
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值