static修饰的对象在类加载时已经创建好了,该类所有的实例共享类变量。所以单例模式创建的实例最好是无状态的,不然在多线程,多个实例操作同一个单例对象会有并发问题。
所以static修饰的东西会在加载类的时候就加载好是吗?
@戈壁老王-:
是的,有兴趣可以了解下类加载的机制,分为五个过程“加载、验证、准备、解析、初始化”
类变量:在准备阶段会对类变量分配内存,初始化的时候会对类变量进行赋值。
成员变量:只有在对类实例化(执行new或者 调用Class<>>.newInstance())时,才会在堆中分配空间。
你可以试下下面这个程序
public class Test {
static{
System.out.println("single");
}
{
System.out.println("multiple");
}
public static void main(String[] args) {
System.out.println("------------");
new Test();
new Test();
}
}
执行结果是这个
single
------------
multiple
multiple
在启动main方法的时候,会进行类加载,所以会打印single且只打印一次,
在每次执行new创建新实例的时候,会打印multiple。
@此木|西贝: 感谢大佬解答
@戈壁老王-: 共同学习而已😀
static在类被加载的时候就创建好了,所有后面调用不就直接返回s了吗,不会去执行new
谢谢