Java 这是一个有效的忽略多线程的单实例吗

Java 这是一个有效的忽略多线程的单实例吗,java,static,singleton,private,Java,Static,Singleton,Private,除了理解上面的代码是否是单例代码之外,我还有一些疑问 Q1)当我创建变量logger时,为什么不调用私有构造函数;当我调用函数getLogger()时,为什么调用私有构造函数 Q2)何时分配test变量的值?在私有构造函数调用之前还是之后 提前谢谢 是的,它是正确的单例,并且是线程安全的 当我创建变量记录器时,为什么不调用私有构造函数;当我调用函数getLogger()时,为什么调用私有构造函数 因为声明变量除了声明变量外,什么都不做。它不调用任何方法,也不创建任何对象 何时分配测试变量的值?在

除了理解上面的代码是否是单例代码之外,我还有一些疑问

Q1)当我创建变量
logger
时,为什么不调用私有构造函数;当我调用函数
getLogger()
时,为什么调用私有构造函数

Q2)何时分配
test
变量的值?在私有构造函数调用之前还是之后


提前谢谢

是的,它是正确的单例,并且是线程安全的

当我创建变量记录器时,为什么不调用私有构造函数;当我调用函数getLogger()时,为什么调用私有构造函数

因为声明变量除了声明变量外,什么都不做。它不调用任何方法,也不创建任何对象

何时分配测试变量的值?在私有构造函数调用之前还是之后


同时,在初始化类时。

它是正确的单例:

当我创建变量记录器时,为什么不调用私有构造函数;当我调用函数getLogger()时,为什么调用私有构造函数

苏。。当您声明一个变量时,您要做的是保留内存空间,而不是使用记录器对其进行初始化,当在记录器类中静态声明记录器实例时,java会在运行时对其进行初始化,然后当您调用getLogger时,您只是给出指向该记录器实例的指针

何时分配测试变量的值?在私有构造函数调用之前还是之后


就在调用构造函数之后。

我的疑问是,如果变量测试在类初始化后立即初始化,为什么不初始化记录器(类成员)呢?初始化类时,它也会初始化记录器。我已经澄清了我的答案。@vardin您的代码片段中有两个名为
logger
的变量。当类加载器加载类时,
private static final
被初始化(变量
test
同时被初始化)。在
main()
中声明的另一个名为
logger
的变量根本没有初始化,因为您只声明了它而没有指定任何值。@Ivan当类加载器加载该类时,
private static final logger
为什么没有初始化?@vardin您认为它为什么没有初始化?我从控制台
test
中的
System.out.println()
中得到消息,它是静态的,所以当classloader第一次加载类时,它的值被赋值。构造函数与静态变量无关。
import java.util.*;
import java.lang.*;
import java.io.*;

class Logger {
    private static final Logger logger = new Logger();
    private static final String test = "value";
    private Logger() {
        System.out.println("Called Constructor!");
    }
    public static Logger getLogger() {
        return logger;
    }
}

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Logger logger;
        Logger logger2 = Logger.getLogger();
    }
}