首页 > 编程笔记

Java final用法详解

final 的意思是“最终的”和“无法更改的”。在 Java 程序中,使用关键字 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 被关键字 final 修饰并初始化,初始化之后就无法更改。一旦在 add() 方法中尝试更改使用关键字 final 修饰的参数 numa,就会发生编译错误。提示的错误信息为:

不能分配最终参数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 修饰的类无法再被继承。

推荐阅读

副业交流群 关注微信公众号,加入副业交流群,学习变现经验,交流各种打法。