高级java每日一道面试题-2024年7月8日-面试者回答:

在Java中,final 关键字是一个非常重要的修饰符,它用于指定某个变量的值一旦初始化之后就不能被改变(对于基本数据类型)或者某个对象的引用一旦指向某个对象之后就不能再指向其他对象(对于对象引用)。final 还可以用来修饰类和方法,但其在这些场景下的作用与修饰变量时有所不同。下面详细解释 final 在Java中的几种用途:

1. final修饰变量

基本数据类型:
  • final 修饰一个基本数据类型的变量时,这个变量的值一旦被初始化之后就不能被改变。
示例:
final int MAX_VALUE = 100;
// MAX_VALUE = 200; // 这行代码会编译错误,因为MAX_VALUE是final的
对象引用:

final 修饰一个对象引用时,这个引用一旦指向某个对象之后就不能再指向其他对象,但是该对象本身是可以被修改的(如果对象是可变的)。

示例:
final List<String> list = new ArrayList<>();
// list = new ArrayList<>(); // 这行代码会编译错误,因为list是final的
list.add("Hello"); // 这是允许的,因为list对象本身是可变的

2. final修饰方法

final 修饰一个方法时,这个方法不能在子类中被覆盖(重写)。这通常用于确保方法的行为在整个继承链中保持不变。

示例:
public class Parent {
    public final void show() {
        System.out.println("This is final method");
    }
}

public class Child extends Parent {
    // @Override // 这行代码会导致编译错误,因为show()在Parent类中是final的
    public void show() {
        System.out.println("This will not override show()");
    }
}

3. final修饰类

final用于修饰一个类时,这个类不能被继承。这通常用于防止类的继承,确保类的完整性和封装性。

示例:
public final class FinalClass {
    // 类实现
}

在这个例子中,FinalClass不能被其他类继承。

4. final局部变量和参数

在方法内部,final可以用于修饰局部变量和方法参数,这意味着这些变量的引用不能改变。但是,如果局部变量是对象类型,那么final只保证了引用不变,对象的内容仍然可以修改。

示例:
public void test(final List<Integer> list) {
    // list = new ArrayList<>(); // 错误,不能重新赋值
    list.add(10); // 正确,改变了list的内容而不是引用
}

在这个例子中,list的引用不能改变,但是可以改变list的内容。

总结

  • final 关键字在Java中用于指定某些内容是不可变的,包括变量的值、方法的覆盖以及类的继承。
  • 对于基本数据类型的变量,final 确保其值不变;对于对象引用,final 确保引用不变但对象本身的状态可以改变(如果对象是可变的)。
  • final 方法不能被覆盖,final 类不能被继承。
  • 使用 final 可以提高程序的稳定性和安全性,但也可能导致代码的灵活性降低。因此,在使用时需要权衡利弊。
上一篇:使用langchain与你自己的数据对话(二):向量存储与嵌入_langchain chat with your data


下一篇:Sklearn 深度学习:构建高效神经网络