修饰范围
类、方法、成员变量。
修饰类
代表着该类不可被继承。例如我们常用的 String 类,它就是使用 final 关键字修饰的。
public class A {};
public class B extends A {} //B 可以继承 A
public class C extends B {} //编译报错,B 已经被 final 关键字修饰了
修饰方法
代表着该方法不可被子类冲重写。例如 AtomicInteger 类中的 get、set 等方法,基本都是使用 final 修饰的。作用就是避免子类修改。
public class Parent {
public void method1() {
//do something
}
public final void method2() {
//do othering
}
}
public class Child {
public void method1() {} //编译通过
public void method2() {} //编译报错,提示:'method2()' cannot override 'method2()' in 'Parent'; overridden method is final
修改成员变量
分两种情况:
- 如果修饰的成员变量是基本类型,例如 int。则该成员变量的值不可被修改,且必须为其赋值。
public class A {
private final int a = 1; //直接赋值,后续不允许重新赋值,否则编译报错。
}
public class B {
private final int a;
public B(int a) {
this.a = a; //使用构造函数赋值,后续不允许重新赋值,否则编译报错。常见于 Spring 官方推荐的 Bean 注入
}
}
- 如果修饰的成员变量是引用类型,例如 Student 类。则该成员变量的引用不可被修改,且必须为其初始化。(注意:只是引用不可被修改,但是 Student 类中的成员变量依旧可以修改)
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
}
public class Main {
private static final Student Z_S = new Student("zhangsan", 20);
public static void main(String[] args) {
Z_S.setAge(18);
System.out.println(Z_S.getAge());
}
}
以上的结果输出的是:18