1、被修饰的类不能被继承。
2、被修饰的方法不能被重写,JVM会尝试进行内联,提高运行效率。
3、被修饰的常量,在编译阶段会存入常量池中。
4、被修饰变量不能被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。
编译器对 final 域要遵循的两个重排序规则更好:(注意一下这个点)
1、在构造函数内对一个 final 域的写入,与随后把这个构造函数对的应用赋值给一个引用变量,这两个操作之间不能被重排序。
2、初次读一个包含 final 域得到对象的引用,与随后初次读取这个 final 域,这两个操作之间不能重排序。
在Java中,final关键字是一个非常重要的修饰符,它可以应用于类、方法和变量。以下是final的几种用法:
1. 修饰变量
当final修饰变量时,这个变量就变成了常量,即它的值一旦被初始化之后就不能被改变。这包括基本数据类型的变量和对象的引用。但是,需要注意的是,如果final修饰的是一个对象引用,那么你不能改变这个引用指向的对象,但是对象的内部状态是可以被改变的(如果这个对象是可变的)。
final int MAX_VALUE = 100; // 基本数据类型的常量
final List<String> NAMES = new ArrayList<>(); // 对象引用的常量,但列表内容可以变
NAMES.add("Alice");
NAMES.add("Bob"); // 合法,因为列表是可变的
NAMES = new ArrayList<>(); // 非法,因为NAMES引用不能改变
2. 修饰方法
当final修饰方法时,这个方法就不能被子类重写。这在设计不希望被继承的类或者类中某些特定方法的行为不应该被子类改变时非常有用。
public class Animal {
public final void eat() {
System.out.println("This animal eats food.");
}
}
public class Dog extends Animal {
// 下面这行会编译错误,因为eat()方法是final的
// @Override
// public void eat() {
// System.out.println("Dog eats meat.");
// }
}
3. 修饰类
当final修饰类时,这个类就不能被继承。这在你想要完全控制类的行为,确保类不会被扩展或者修改时非常有用。
public final class String {
// 示例,实际上String类在Java中是final的
// 因为String类的设计者不希望String被继承
}
// 下面的代码会编译错误,因为String是final的
// public class MyString extends String {
// }