Java singleton,它是如何工作的?

Java singleton,它是如何工作的?,java,Java,我不完全理解Java中单例类的概念。例如,我有这样的单例类: private int i = 0; private static Singleton INSTANCE = new Singleton(); public static Singleton getInstance() { return INSTANCE; } public int getI() { return i; } public void setI(int i) { this.i = i; }

我不完全理解Java中单例类的概念。例如,我有这样的单例类:

private int i = 0;
private static Singleton INSTANCE = new Singleton();

public static Singleton getInstance() {
    return INSTANCE;
}

public int getI() {
    return i;
}

public void setI(int i) {
    this.i = i;
}
所以每次我调用getInstance()时,它不是因为以下原因而创建了一个新的Singleton对象:
newSingleton()

那么为什么我要这样初始化它:

Singleton s = Singleton.getInstance();
    Singleton s2 = Singleton.getInstance();

    s.setI(5);

    System.out.println(s.getI());

    System.out.println(s2.getI());
我得到了两次“5”。 它不应该第二次给我写0吗?我真的错过了一些东西,但不知道是什么

    INSTANCE = new Singleton();
将只被调用一次,因为它是静态的。此后:

    getInstance()

仅返回静态实例

Singleton是一个仅包含一个类的模式,该类负责创建一个对象,同时确保只创建一个对象

该类提供了一种访问其唯一对象的方法,可以直接访问该对象,而无需实例化该类的对象

为了实现这一目标,联合国应:

  • 私有构造函数来限制从其他类实例化类

  • 同一类的私有静态变量,该类是该类的唯一实例

  • 返回类实例的公共静态方法,这是外部世界获取单例类实例的全局访问点

    公共类单一对象{

    private int i = 0;
    //create an object of SingleObject
    private static SingleObject instance = new SingleObject();
    
    //make the constructor private so that this class cannot be
    //instantiated
    private SingleObject() {}
    
    //Get the only object available
    public static SingleObject getInstance() {
        return instance;
    }
    
    public int getI() {
        return i;
    }
    
    public void setI(int i) {
        this.i = i;
    }
    
    }


  • At
    Singleton INSTANCE=new Singleton()
    part
    new Singleton()
    创建
    Singleton
    类型的新实例,并返回对它的引用(reference=JVM用来标识对象的编号),该引用存储在
    instance
    变量中。在
    return INSTANCE
    方法返回表示先前创建的一个单例实例的引用(编号),不需要再创建其他单例实例。问题似乎在于您不了解变量的工作原理。可能相关:@Boharuk123 no。。它是一个
    静态
    变量。全班只有一个。我建议您阅读Oracle关于@Boharuk123的Java教程,它不需要检查。它在类首次加载时创建它。然后调用
    Singleton.getInstance()每次都会得到相同的值。(这也是一个静态方法,因此不使用对象来调用该方法。)值是创建的一个对象。
    INSTANCE=newsingleton()
    只是变量的初始化。它的初始化次数不会超过一次。您可以使用
    ==
    检查它们是否相同,这将检查它们是否具有相同的引用,例如
    System.out.println(“相同的单例:”+(s==s1))我认为你所做的与singleton模式无关,你只是创建了一个名为instance的静态属性,该属性将在singleton类的所有实例之间共享。除此之外,s和s2对同一实例具有相同的引用,这就是为什么它总是返回相同的i值。