关于java:Java-final-关键字总结

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 润饰。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理