在 Java 中制作 Class 静态决赛背后的概念

Concept Behind Making A Class Static Final in Java

我是 Java 的新手,在学校阶段,我有一个疑问,谁能更好地解释一下它背后的概念、它的含义、何时使用以及为什么。

public class ParentClass {
    private static final ParentClass ourInstance=new ParentClass();
    private ArrayList<Integer> arr=new ArrayList<>();
    public static ParentClass getinstance() {
        return ourInstance;
    }
    private ParentClass() {

    }
    public void setList(ArrayList<Integer> al) {
        arr.addAll(al);
    }

    public ArrayList<Integer>  getList(){
        return arr;
    }

}

我想重点关注这一行 private static final ParentClass ourInstance=new ParentClass(); 它是什么意思,什么时候我们必须像这样声明语法?我知道我们可以将 class 设置为 Final 然后没有 subclass 可以扩展 final class.In 以上代码的声明方式有所不同,这让我很困惑。

I know when we can make the class Final then no subclass can extends the final class.

没错。但是在您的代码中, final 正在应用于一个字段,这意味着该静态字段 ourInstance 不会被修改,即不会被重新分配给另一个实例。

这里之所以应用static

private static final ParentClass ourInstance = new ParentClass();

正在与

合作
public static ParentClass getinstance() {
    return ourInstance;
}

private ParentClass() {
}

实施 singleton design pattern.

你正在做的是 "You are creating Class constant",这个上下文中的 final 这个词是用来创建常量的。而且它是静态的,因此无需创建实例来访问它。

你在它声明的地方实例化它,因为你不能在外面做,因为你的构造函数是私有的。因此,只能通过调用 getInstance 访问此 class 的实例,也可以访问已创建的实例。在其外部无法创建实例。这样你就创建了单例,意味着这个 class 的一个实例只会在 VM 中创建。

private static final ParentClass ourInstance=new ParentClass();

当您将 class 的字段声明为 final 时,您无法在初始化后重新分配它的值。

意思是你不能执行下面的代码:

ParentClass otherInstance = new ParentClass();
ourInstance = otherInstance;   // Not allowed as ourInstance is final.

但是您可以执行以下操作,即您可以通过调用其 setter 方法来更改 ourInstance 的字段:- 例如

ourInstance.setSomeMethod(someValue);   // Allowed as you are not modifying object's reference but only its properties which are not final.