Java final keyword

final keyword

final变量

被final修饰的变量,必须在声明时赋值,或者在构造函数中赋值,或者在代码块中赋值,不能在后面的代码中修改。

final 修饰的成员变量必须有一个默认值,否则编译器将会提醒没有初始化。

实例代码如下:

private final int age = 18;

或者如下赋值:

private final int age;
public FinalField() {
    this.age = 18;
};

final 修饰的成员变量可以是基本类型,也可以是引用类型。

final 修饰的成员变量不能被修改,但是引用类型的变量指向的对象的内容是可以修改的

实例代码如下:

public class Pig {
    private String name;

    public Pig() {}

    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

虽然我么们不能修改 final 修饰的成员变量,但是我们可以修改引用类型的变量指向的对象的内容。
实例代码如下:

public class FinalField {
   private final Pig pig = new Pig();

   public void out(){
       this.pig.setName("Joudys");
       System.out.println(this.pig.getName());
   }
}

final和static 一起修饰的成员变量叫做常量,常量名必须全部大写,单词之间用下划线分隔。
实例代码如下:



public class FinalField {
    private final static String NAME = "Joudys";
}

final方法

被final修饰的方法,不能被重写。 如果我们在设计一个类的时候,认为某些方法不应该被重写,就应该把它设计成 final 的。

Thread 类就是一个例子,它本身不是 final 的,这意味着我们可以扩展它,但它的 isAlive() 方法是 final 的。

public class Thread implements Runnable {
    public final native boolean isAlive();
}

需要注意的是,该方法是一个本地(native)方法,用于确认线程是否处于活跃状态。而本地方法是由操作系统决定的,因此重写该方法并不容易实现。

学习思考

一个类是 final 的,和一个类不是 final,但它所有的方法都是 final 的,考虑一下,它们之间有什么区别?

前者不能被继承,也就是说方法无法被重写;后者呢,可以被继承,然后追加一些非 final 的方法。

final类

如果一个类使用了 final 关键字修饰,那么它就无法被继承。
例如,String 类就是一个 final 类,我们不能扩展它。

public final class String {
    public String() {}
}

为什么 String 类要设计成 final?原因大致如下:

  • 为了实现字符串常量池;
  • 为了线程安全;
  • 为了 HashCode 的不可变性;

参考链接

  1. https://javabetter.cn/oo/final.html
posted @ 2025-06-17 21:38  joudys  阅读(27)  评论(0)    收藏  举报