Java 是否每次调用静态方法时都会创建一个新对象(在helper类中)?
一般的问题是,如果在类A中创建了一个对象(全局),那么类A中的新对象是否在每次由不同类调用任何静态方法时创建 我的猜测是肯定的,因为语句本身创建了对象,但我找不到关于这个特定情况的任何澄清(可能是因为这是一个愚蠢的问题) 使用Helper的主类 在上面的示例中,是否由于这些调用创建了2个对象(不询问是否创建了2个辅助对象) 我可能会重新考虑helper类的设计,但这让我想得到最初问题的答案Java 是否每次调用静态方法时都会创建一个新对象(在helper类中)?,java,class,Java,Class,一般的问题是,如果在类A中创建了一个对象(全局),那么类A中的新对象是否在每次由不同类调用任何静态方法时创建 我的猜测是肯定的,因为语句本身创建了对象,但我找不到关于这个特定情况的任何澄清(可能是因为这是一个愚蠢的问题) 使用Helper的主类 在上面的示例中,是否由于这些调用创建了2个对象(不询问是否创建了2个辅助对象) 我可能会重新考虑helper类的设计,但这让我想得到最初问题的答案 public class Helper { private static Object x =
public class Helper {
private static Object x = new Object();
public static void method1(){
//uses x
}
public static void method2(){
//uses x
}
}
如有任何澄清,将不胜感激 来自JLS
如果一个字段被声明为静态的,那么无论最终创建多少个类实例(可能为零),该字段只存在一个化身。静态字段(有时称为类变量)在初始化类()时具体化
因此,对象只创建一次,因为静态
字段只创建一次。过程如下(简化):
Main
类已加载Main.Main()
方法被调用Helper
类已加载x=newobject()
Helper.method1()
Helper.method2()
为什么会创建两个对象?只有1个,由
Object x=new Object()创建代码>静态变量只初始化一次,将只创建一个对象。@这不是完全正确的。静态变量在类加载时初始化。但问题不是字段存在多少次,而是它被调用了多少次。在上面的示例中引用OP,是否由于这些调用创建了2个对象@M0SKIT0对象和字段是不同的东西。可以创建两个对象并将其分配给同一字段。@m0skit0所以您建议创建多个对象?怎么做?不,理论上,不在提供的示例中。我的意思很简单,JLS的相关部分是“一个静态字段[…]在类初始化时被具体化”,所以当main()被执行时,类助手被加载一次?调用这些方法时,这些方法引用的是同一个静态对象?@是的,正确。请注意,可以更早地加载类,这只是一个简化的示例,以便您了解字段何时初始化以及为何只初始化一次。
public class Main{
public static void main(String[] args){
Helper.method1();
Helper.method2();
}
}