在Java中,final
关键字是一个修饰符,它用于表示某个类、方法或变量是不可变的或不可继承的。以下是final
关键字在Java中的主要用途:
1. final变量
当变量被声明为final
时,它的值在初始化后就不能被改变。final
变量可以是基本数据类型,也可以是引用类型。对于基本数据类型,final
保证了变量值的不变性;而对于引用类型,final
保证了引用本身的不变性,即引用一旦指向某个对象,就不能再指向其他对象,但是该对象的内容是可变的(除非该对象本身也被声明为不可变的)。
示例:
final int FINAL_CONSTANT = 10; // final基本类型变量 | |
final String str = "Hello"; // final引用类型变量,但指向的字符串对象是不可变的 |
2. final方法
当方法被声明为final
时,该方法就不能被子类覆盖(重写)。这通常用于防止子类修改某个重要的方法的行为。
示例:
public class Parent { | |
public final void showMessage() { | |
System.out.println("Parent's message"); | |
} | |
} | |
public class Child extends Parent { | |
// 下面这行会编译失败,因为showMessage()方法在Parent类中被声明为final | |
// @Override | |
// public void showMessage() { | |
// System.out.println("Child's message"); | |
// } | |
} |
3. final类
当类被声明为final
时,它就不能被其他类继承。这通常用于设计那些不需要被继承的类,如工具类(如String
类在Java中就是final
的)。
示例:
public final class FinalClass { | |
// ... | |
} | |
// 下面这行会编译失败,因为FinalClass被声明为final | |
// public class Subclass extends FinalClass { | |
// // ... | |
// } |
4. final与static
final
和static
可以一起使用来定义常量。这样的常量在类加载时就被初始化,并且在整个程序的生命周期中都是不变的。通常,这样的常量使用大写字母命名,并用下划线分隔单词。
示例:
public class Constants { | |
public static final int MAX_VALUE = 100; // final和static一起使用的常量 | |
} |
5. final与匿名内部类
在Java中,匿名内部类(通常用于实现接口或继承其他类)只能访问其外部类的final
变量。这是因为匿名内部类是在运行时动态生成的,并且它不会持有外部类变量的引用。通过将变量声明为final
,可以保证其值在匿名内部类被创建后不会改变。
示例:
public class Outer { | |
private final int outerValue = 10; | |
public void doSomething() { | |
class Inner { | |
public void printOuterValue() { | |
System.out.println(outerValue); // 可以访问外部类的final变量 | |
} | |
} | |
Inner inner = new Inner(); | |
inner.printOuterValue(); | |
} | |
} |
在这个例子中,outerValue
被声明为final
,这样它就可以在匿名内部类Inner
中被访问。