文章目录
一、final介绍
在Java中,final 关键字用于声明一个变量、方法或类是不可变的。它可以应用于以下几个上下文中:
1. 修饰变量
当用 final 修饰一个变量时,表示该变量只能被赋值一次,即它是一个常量。一旦赋值后,就不能再修改。例如:
final int NUM = 10;
2. 修饰方法:
当用 final 修饰一个方法时,表示该方法不能被子类重写(覆盖)。例如:
Copy code
public final void someMethod() {
// 方法体
}
3 .修饰类
当用 final 修饰一个类时,表示该类不能被继承,即它是一个最终类。例如:
Copy code
public final class SomeClass {
// 类定义
}
作用
final 的作用是提供一种约束机制,确保变量、方法或类的状态在初始化后不会被修改,或者在继承和扩展方面提供额外的安全性。使用 final 可以使代码更易于理解和维护,并提高代码的安全性和健壮性。
如果不添加 final 关键字,则变量、方法或类将不受约束,可以随时被修改或继承。
二、与static的比较
当涉及到 final
关键字时,可以将其与其他关键字进行比较,例如 static
。下面是关于 final
和 static
的比较:
1. final vs. static:
final
关键字用于声明不可变的变量、方法或类,其值在初始化后不能被修改。
static
关键字用于声明静态变量、方法或类,其在类加载时初始化,且只有一份拷贝,可以通过类名直接访问。
2. final vs. 非final:
使用final
声明的变量是不可变的,它的值在初始化后不能被修改。这种约束可以提高代码的安全性和健壮性,因为它防止了意外的修改。
没有使用final
声明的变量是可变的,可以被重新赋值。这意味着它的值可以在程序的执行过程中改变。
3. final vs. 静态final:
final
变量在初始化后值不可变,但是它可以是实例变量(每个对象有自己的值)或静态变量(所有对象共享相同的值)。
静态final变量在初始化后值也不可变,但它只有一份拷贝,被所有对象共享。
综上所述,final
关键字提供了一种在程序中创建不可变的元素的机制,而 static
关键字则提供了一种在整个类中共享数据的机制。它们在不同的情况下可以用于增加代码的安全性、性能或逻辑清晰度。
4、final变量分析
public class FinalExample {
final int MAX_VALUE = 100; // final实例变量,每个对象都有自己的MAX_VALUE值
public void display() {
// MAX_VALUE = 200; // 编译错误,final变量不能被重新赋值
System.out.println("MAX_VALUE: " + MAX_VALUE);
}
public static void main(String[] args) {
FinalExample obj = new FinalExample();
obj.display();
}
}
5. 静态final变量示例
public class StaticFinalExample {
static final double PI = 3.14; // 静态final变量,所有对象共享相同的PI值
public void display() {
// PI = 3.14159; // 编译错误,静态final变量不能被重新赋值
System.out.println("PI: " + PI);
}
public static void main(String[] args) {
StaticFinalExample obj1 = new StaticFinalExample();
StaticFinalExample obj2 = new StaticFinalExample();
obj1.display(); // 输出:PI: 3.14
obj2.display(); // 输出:PI: 3.14
}
}
6. static方法示例:
public class StaticMethodExample {
static int counter = 0; // 静态变量
public static void incrementCounter() {
counter++; // 静态方法可以直接访问静态变量
}
public void displayCounter() {
System.out.println("Counter: " + counter);
}
public static void main(String[] args) {
StaticMethodExample.incrementCounter(); // 调用静态方法
StaticMethodExample.incrementCounter(); // 再次调用静态方法
StaticMethodExample obj = new StaticMethodExample();
obj.displayCounter(); // 输出:Counter: 2
}
}