final 关键字

final 关键字次要作用为避免数据被批改,保障代码平安。

能够用于润饰:类中办法变量参数;

润饰类

相干代码

final class Person {}// 谬误,不能够继承被 final 润饰的类class Student extends Person {}

概念

当应用 final 关键字润饰类的时候,示意该类不能够被继承,类中所有办法默认均为 final

final 润饰类能够避免被继承,如 JDK 代码中的 java.lang.String 类就是被final 润饰的,从而避免被其余类继承,导致外部逻辑被毁坏。

润饰类中办法

代码

class Person {    // 禁止子类重写该办法,批改其含意    final String getIdentity() {        return "I am a person!";    }}class Student extends Person {    // 谬误,禁止重写父类的该办法    @Override    final String getIdentity() {        return "I am a Student!";    }}

概念

当咱们不心愿子类重写父类的办法,批改父类该办法的定义时能够应用 final 润饰。

这样任何子类都不能够重写父类的该办法。

润饰变量

代码

public static void main(String[] args) {    final int num;    final Object o;    num = 10;    o = new Object();    // 下边两行是谬误的    num = 20;    o = new Object();}
public class Test {    // 类中的final成员变量必须在结构器中进行初始化    private final Object object;        public Test() {        this.object = new Object();    }        // 谬误,被final润饰的成员变量必须确保类中的结构器执行后,该变量实现初始化!!!    public Test(Object object) {    }}

概念

当咱们应用 final 关键字对变量进行润饰的时候。

  1. 当润饰的变量为内置类型时,一但实现初始化后,该变量的不能够进行批改。
  2. 当润饰的变量为援用类型时,一但实现初始化后,该变量中的对象援用不会指向其余对象,但能够批改对象外部的内容。
  3. 当咱们用 final 润饰成员变量时,必须确保类中的结构器执行后,该变量实现初始化用 final 润饰变量能够避免数据被批改,保障平安。

润饰参数

代码

public void testInnerType(final int num) {    num = 10; // error: Cannot assign a value to final variable 'num';}public void testObject(final Object o) {    o = new Object(); // error: Cannot assign a value to final variable 'o';}

概念

final 润饰参数尽管能够做到参数不被批改,这么做并无任何意义。

Java 中的内置类型作为参数为值拷贝,用 final 润饰参数保障了形参不会被批改,并不能保障实参被批改。

Java 中的援用类型作为参数为援用拷贝,相当于减少一个援用指向实参所指向的对象,用 final 润饰参数保障了形参不会批改其指向的对象,并不能保障实参被批改。

因而,应用 final 润饰参数,并不能做到避免实参被批改,因而不须要在参数处加 final。如须要形参不被该办法批改,才须要应用 final 润饰。