Java final用法详解
final 的意思是“最终的”和“无法更改的”。在 Java 程序中,使用关键字 final 修饰的变量、方法和类具有以下特点:
因此,在程序设计中要谨慎使用关键字 final。
使用关键字 final 修饰的变量只能被赋值一次,如果再次对该变量赋值,那么程序编译时会报错。被关键字 final 修饰的变量必须进行初始化,既可以在定义时初始化,又可以在构造方法或非静态代码块中初始化。
下面演示使用关键字 final 初始化之后无法被更改的过程。
【实例】使用关键字final修饰属性。
除了可以修饰变量,使用关键字 final 还可以修饰方法(称为最终方法)。因此,使用关键字 final 修饰的方法不能被覆盖重写。最终方法主要影响继承中子类对父类方法的重写,如果父类不希望被子类重写,那么使用关键字 final 修饰即可,具体方法如下面的实例所示。
【实例】使用关键字 final 修饰方法。
图 1 运行结果
由运行结果可知,使用关键字 final 修饰的 age() 方法被重写后,编译会报错。
除此之外,使用关键字 final 修饰的类无法再被继承。使用关键字 final 修饰的类无法被任何类继承,也就是说,既无法派生子类,又无法进行任何改动。下面用一个实例为例来说明。
【实例】使用关键字 final 修饰类。
- 使用关键字 final 修饰的变量称为常量,只能被赋值一次;
- 使用关键字 final 修饰的方法称为最终方法,不能被子类重写;
- 使用关键字 final 修饰的类称为最终类,不能被继承;
因此,在程序设计中要谨慎使用关键字 final。
使用关键字 final 修饰的变量只能被赋值一次,如果再次对该变量赋值,那么程序编译时会报错。被关键字 final 修饰的变量必须进行初始化,既可以在定义时初始化,又可以在构造方法或非静态代码块中初始化。
下面演示使用关键字 final 初始化之后无法被更改的过程。
【实例】使用关键字final修饰属性。
public class Test{ int numb; public static void main(string[] args){ // 初始化使用关键字final修饰的变量,并且初始化后不可修改 final int numa = 1; // numa++; // 错误,不能修改 numa int numc = add(2,3); System.out.println(numc); final FinalVar f = new FinalVar(); // f = null; // 错误,不能改变引用指向 f.numb = 100; // f引用指向的对象属性可以更改,只要指向不变 System.out.println(f.numb); } public static int add(final int numa, int numb){ // numa++; // 错误,不能修改 numa numb++; return numa + numb; } }运行结果为:
6
100
不能分配最终参数numa
f 引用指向的对象确定后,就无法再更改。提示的错误信息为:无法为最终变量f分配值
除了可以修饰变量,使用关键字 final 还可以修饰方法(称为最终方法)。因此,使用关键字 final 修饰的方法不能被覆盖重写。最终方法主要影响继承中子类对父类方法的重写,如果父类不希望被子类重写,那么使用关键字 final 修饰即可,具体方法如下面的实例所示。
【实例】使用关键字 final 修饰方法。
class Human5 { // 使用关键字final修饰age()方法,意味着该方法不能被子类重写 public final void age() { // 代码 } } class Sportsman5 extends Human5 { // 重写final方法 public void age() { // 代码 } } public class Test { public static void main(String[] args) { // 创建Sportsman5类的实例对象 Sportsman5 b = new Sportsman5(); } }运行结果如下图所示。
图 1 运行结果
由运行结果可知,使用关键字 final 修饰的 age() 方法被重写后,编译会报错。
除此之外,使用关键字 final 修饰的类无法再被继承。使用关键字 final 修饰的类无法被任何类继承,也就是说,既无法派生子类,又无法进行任何改动。下面用一个实例为例来说明。
【实例】使用关键字 final 修饰类。
final class Human6 { // 代码 } class Sportsman6 extends Human6 { // 代码 } public class Test { public static void main(String[] args) { // 创建Sportsman6类的实例对象 Sportsman6 b = new Sportsman6(); } }运行结果为:
无法从最终chapter5.Human6进行继承
由运行结果可知,程序报错信息显示无法从最终父类 Human 继承,因为 Human 类使用关键字 final 修饰。由此可知,使用关键字 final 修饰的类无法再被继承。