一、总体概览

image.png

  • final是Java中的一个关键字
  • final表示最终的,不可变的

    二、final修饰变量

    final修饰的变量只能赋一次值!!!

    2.1 final修饰局部变量

    image.png

    1. public class FinalTest01 {
    2. public static void main(String[] args) {
    3. final int i;
    4. i = 1;
    5. // 只能赋一次值!!!
    6. //i = 2; // Variable 'i' might already have been assigned to
    7. }
    8. }

    2.2 final修饰实例变量

    image.png

  • 如果没有为实例变量手动赋初值,则系统会为其赋一个默认值

    1. public class FinalTest01 {
    2. int i;
    3. public static void main(String[] args) {
    4. FinalTest01 finalTest01 = new FinalTest01();
    5. System.out.println(finalTest01.i); // 0
    6. }
    7. }
  • 实例变量是在构造方法执行过程中赋值的,因此,对于final修饰的实例变量,系统不会为其赋初值,而是要求程序员手动赋值。可以在变量后面直接赋值,也可以利用构造方法为其赋值

    1. class A{
    2. final int i;
    3. public A(){
    4. i = 0;
    5. }
    6. }

    2.3 常量

  • final修饰的实例变量一般和static联合使用,这样的变量叫做常量,常量名全部大写,并用下划线分隔

    • 为什么呢?因为实例变量是存储在堆中的,每个对象都有一份,既然已经使用final修饰实例变量了,那么就代表该变量是不可变的了,所以就没有必要一个对象一份了,而是将其同时使用static修饰,变成一个常量,这样做可以节省内存空间
  • 实际上常量和静态变量都是存储在方法区中的,都是在类加载时初始化;唯一的区别就是:常量不可变;常量一般是public的

    三、final修饰类

    final修饰的类无法被继承!!! ```java final class A{

}

class B extends A{ // 该类无法通过编译,Cannot inherit from final ‘org.example.A’ // 不能从最后的’org.example.A’继承 }

  1. <a name="uyR9h"></a>
  2. # 四、final修饰方法
  3. final修饰的方法**无法重写**!!!
  4. ```java
  5. class A{
  6. public final void f(){
  7. System.out.println("A.f()");
  8. }
  9. }
  10. class B extends A{
  11. public void f(){
  12. // 无法通过编译
  13. // 'f()' cannot override 'f()' in 'org.example.A'; overridden method is final
  14. }
  15. }

五、final修饰引用

final修饰的引用一旦指向了某个对象,则不能再指向其他对象,但是该引用指向的对象中的内部数据可以改变

public class FinalTest01 {
    public static void main(String[] args) {
        final A a = new A();
        //a = new A(); // Cannot assign a value to final variable 'a'

        a.i = 10;

        System.out.println(a.i); // 10
    }
}

class A{
    int i = 0;
}