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