Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么私有变量只增加一倍,甚至它被称为多个变量_Java_Class_Static Members - Fatal编程技术网

Java 为什么私有变量只增加一倍,甚至它被称为多个变量

Java 为什么私有变量只增加一倍,甚至它被称为多个变量,java,class,static-members,Java,Class,Static Members,我是java新手,我试图理解为什么a即使a++运行了3次,但只增加了一次,也没有增加 为什么另外两个实例没有做出和第一个实例相同的行为,是哪个原则做的 a是一个实例变量,这意味着您在主方法中创建的三个ClassicSingleton类中的每一个都有自己的该变量副本,该变量初始化为0(默认情况下),并由构造函数递增为1 顺便说一句,ClassicSingleton在这里是一个误导性的名称,因为您的ClassicSingleton.getInstance()在每次调用时都返回一个新实例。即使在每次

我是java新手,我试图理解为什么
a
即使
a++
运行了3次,但只增加了一次,也没有增加

为什么另外两个实例没有做出和第一个实例相同的行为,是哪个原则做的


a
是一个实例变量,这意味着您在主方法中创建的三个
ClassicSingleton
类中的每一个都有自己的该变量副本,该变量初始化为0(默认情况下),并由构造函数递增为1

顺便说一句,
ClassicSingleton
在这里是一个误导性的名称,因为您的
ClassicSingleton.getInstance()
在每次调用时都返回一个新实例。即使在每次调用中返回相同的实例,
a
仍将包含1(因为这次您将有一个
ClassicSingleton
实例,其中
a
将只增加一次)

哦,如果您希望
ClassicSingleton
成为实际的singleton,请将
getInstance
更改为:

public static ClassicSingleton getInstance() {
    if (instance == null) {
        instance = new ClassicSingleton();
    }
    return instance;
}
有两个原因

  • a
    是一个实例变量,在构造时仅递增一次
  • 每次调用
    getInstance
    ,都会创建一个新实例,这将用一个新实例替换共享实例。基本上,您实现了经典的单例错误,而是实现了工厂方法

  • 要修复单例,请检查
    instance
    是否为null,并仅在这种情况下创建一个新实例

    基本上,tmp中的
    a、tmp2和tmp3在这个类的所有实例中都是完全独立的。所以您的单例根本不是单例,请查看本教程,了解检查实例是否为null或null的澄清范围not@Kad
    instance
    变量应仅保留对单个实例的引用。这就是singleton模式的要点-只创建了类的一个实例。@Eran如果变量在每次创建实例时都获得第一个值,我们如何创建这样的singleton<代码>私有静态ClassicSingleton实例=null链接:@Kad嗯,您有
    b
    变量,它跟踪调用
    getInstance
    的次数。在构造函数中增加一个变量(如
    a
    )在单例类中是没有意义的,因为它只会增加一次。@Eran我不想让单例类名仅保留在示例中
    public static ClassicSingleton getInstance() {
        if (instance == null) {
            instance = new ClassicSingleton();
        }
        return instance;
    }