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
关键字对变量进行润饰的时候。
- 当润饰的变量为内置类型时,一但实现初始化后,该变量的值不能够进行批改。
- 当润饰的变量为援用类型时,一但实现初始化后,该变量中的对象援用不会指向其余对象,但能够批改对象外部的内容。
- 当咱们用
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
润饰。