在Java中进行类静态最终决赛的概念

时间:2018-12-18 04:47:49

标签: java final

我是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();这行的含义,以及什么时候必须声明这样的语法?我知道我们可以将类定为Final,然后再没有子类可以扩展final类。在上述代码中,声明的方式有所不同,这使我感到困惑。

4 个答案:

答案 0 :(得分:1)

private static final ParentClass ourInstance=new ParentClass();

当您将某个类的字段声明为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.

答案 1 :(得分:0)

  

我知道何时可以将类定为Final,那么没有子类可以扩展final类。

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

在此处应用static的原因:

private static final ParentClass ourInstance = new ParentClass();

正在使用

public static ParentClass getinstance() {
    return ourInstance;
}

private ParentClass() {
}

实施singleton design pattern

答案 2 :(得分:0)

您正在做的是“您正在创建类常量”,在此上下文中,单词final用于创建常量。而且它是静态的,因此无需创建实例来访问它。

您正在实例化它的声明位置,因为您的构造函数是私有的,因此您无法在外部执行它。因此,只有通过调用getInstance才能访问此类的实例,也可以访问已经创建的实例。外面不可能创建实例。这样,您就可以创建单例,这意味着将在VM中仅创建此类的一个实例。

答案 3 :(得分:-1)

由于包含了关键字static,因此对于该类的所有对象,该值将恒定。私有最终变量值将类似于每个对象的常量。您可以引用java.lang.String。静态类是所有类实例和类本身上的相同成员。