Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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 是否每次调用静态方法时都会创建一个新对象(在helper类中)?_Java_Class - Fatal编程技术网

Java 是否每次调用静态方法时都会创建一个新对象(在helper类中)?

Java 是否每次调用静态方法时都会创建一个新对象(在helper类中)?,java,class,Java,Class,一般的问题是,如果在类A中创建了一个对象(全局),那么类A中的新对象是否在每次由不同类调用任何静态方法时创建 我的猜测是肯定的,因为语句本身创建了对象,但我找不到关于这个特定情况的任何澄清(可能是因为这是一个愚蠢的问题) 使用Helper的主类 在上面的示例中,是否由于这些调用创建了2个对象(不询问是否创建了2个辅助对象) 我可能会重新考虑helper类的设计,但这让我想得到最初问题的答案 public class Helper { private static Object x =

一般的问题是,如果在类A中创建了一个对象(全局),那么类A中的新对象是否在每次由不同类调用任何静态方法时创建

我的猜测是肯定的,因为语句本身创建了对象,但我找不到关于这个特定情况的任何澄清(可能是因为这是一个愚蠢的问题)

使用Helper的主类

在上面的示例中,是否由于这些调用创建了2个对象(不询问是否创建了2个辅助对象)

我可能会重新考虑helper类的设计,但这让我想得到最初问题的答案

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.Main()
    方法被调用
  • Helper
    类已加载
  • 为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();
         }
    }