在Java中,`final` 是一个关键字,用于限制某些特性,确保不可改变性。可以用在类、方法和变量上,具体如下:
1. `final` 类
当类被声明为 `final` 时,该类不能被继承。也就是说,不能有子类扩展这个类。这在需要保护设计和实现安全的情况下非常有用。例如:
```java
final class FinalClass {
// 成员变量和方法
}
// 以下代码会报错
class SubClass extends FinalClass {
// 编译错误: Cannot subclass the final class FinalClass
}
```
2. `final` 方法
如果一个方法被声明为 `final`,则该方法不能在任何子类中被重写。这保证了父类中的方法行为不会被修改。
class Parent {
public final void display() {
System.out.println("This is a final method.");
}
}
class Child extends Parent {
// 以下代码会报错
@override
public void display() { // 编译错误: Cannot override the final method from Parent
System.out.println("Trying to override.");
}
}
3. `final` 变量
当一个变量被声明为 `final`,它的值在赋值后不能更改。
- 对于final修饰的基本类型变量,变量存储的数据不能改变
- 对于final修饰的引用数据变量,变量存储的地址不能改变,但地址所指向对象的内容可以改变
final int CONSTANT = 10; // 基本数据类型
// CONSTANT = 20; // 编译错误: Cannot assign a value to final variable CONSTANT
final List<String> myList = new ArrayList<>();
myList.add("Hello"); // 这是允许的,因为我们没有更改引用
// myList = new ArrayList<>(); // 编译错误: Cannot assign a value to final variable myList
4.‘final’常量
public class Constants {
public static final int MAX_USERS = 100;
public static final String APP_NAME = "MyApplication";
MAX_USERS = 200; // 编译错误
}
特性
-
不可变性:一旦被赋值,
final
常量的值就不能再被修改。比如,尝试这样做会导致编译错误: -
静态常量:通常,
final
常量会与static
关键字结合使用,意味着常量属于类而不是类的实例。这样可以直接通过类名访问。 -
大写命名:常量通常使用大写字母命名,以便于识别。
优点
- 使用常量记录系统配置信息的优势、执行原理
- ·代码可读性更好,可维护性也更好。
- ·程序编译后,常量会被“宏替换”:出现常量的地方全部会被替换成其记住的学面量,
- 这样可以保证使用常量和直接用字面量的性能是一样的。
使用场景
- **`final` 类**: 确保类不能被扩展,常用于设计安全性和稳定性(例如 `String` 类)。
- **`final` 方法**: 保证一种特定方法的行为不被改变。
- **`final` 变量**: 定义常量,增强代码可读性和安全性,不允许值被更改。
注意事项
- `final` 关键字仅影响变量、方法、类的可变性;并不影响对象内部状态的可变性。
- 在编程中,合理使用 `final` 可以帮助实现更高的安全性和更好的设计。
- final放的位置和static同等,如:public final。