1. final关键字的作用
先来看一下final关键字在Java中的作用。final关键字可以用来修饰类、方法和变量。当final关键字修饰类时,该类不能被继承;当final关键字修饰方法时,该方法不能被重写;当final关键字修饰变量时,该变量在初始化之后不能再被修改。final关键字的作用就是为了让程序员可以编写更加健壮的代码。
2. final方法能否被继承?
既然final关键字可以用来修饰方法,那么我们就来看一下final方法能否被继承。在Java中,final方法是不能被重写和修改的,所以我们不能用子类来覆盖final方法的实现。
这里还需要注意一点,虽然我们不能用子类继承final方法,但是可以通过使用super关键字来调用父类的final方法。例如:
public class Parent {
public final void finalMethod() {
System.out.println("This is a final method.");
}
}
public class Child extends Parent {
public void method() {
super.finalMethod(); // 调用父类的final方法
}
}
在上面的代码中,虽然Child类不能重写Parent类的finalMethod(),但是它可以通过super.finalMethod()来调用该方法。
3. final变量能否被修改?
final关键字还可以用来修饰变量,使得变量在初始化之后不能再被修改。例如:
public class Test {
public static void main(String[] args) {
final int a = 10;
// a = 20; // 编译错误,a是final变量,不能被修改
System.out.println(a);
}
}
上面的代码中,a是一个final变量,它的值在初始化之后不能再被修改,如果我们尝试修改a的值,编译器就会报错。
4. final变量和不可变对象的区别
final变量和不可变对象是两个不同的概念。final变量只保证了变量在初始化之后不能再被修改,但是它并不保证该变量所引用的对象是不可变的。例如:
public class Test {
public static void main(String[] args) {
final List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
// list = new ArrayList<>(); // 编译错误,list是final变量,不能重新赋值
list.clear(); // 可以调用List接口的clear()方法清空list中的元素
System.out.println(list);
}
}
在上面的代码中,list是一个final变量,它指向一个可变的ArrayList对象。虽然我们不能重新赋值给list,但是我们可以调用ArrayList的clear()方法来清空list中的元素。
如果我们想要让所引用的对象不可变,可以使用不可变对象。例如,Java中的String类就是一个不可变对象,它一旦被初始化之后就不能再被修改了。
5. 总结
本文介绍了final关键字的作用,以及final方法和final变量的特点。尤其需要注意的是,final变量和不可变对象是两个不同的概念,final变量只保证了变量在初始化之后不能再被修改,但是它并不能保证该变量所引用的对象是不可变的。