【问题标题】:Difference between creating object and keeping it static创建对象和保持静态之间的区别
【发布时间】:2014-08-12 23:18:53
【问题描述】:

我有两个关于对象和在 Java 中使用静态的问题。我发现如果我在相同的背景下提出问题,我可以最好地解释我的问题:

我的程序中有一个主要课程。首先它初始化了很多东西,然后它启动了 run 方法,该方法在 while (true) 循环中循环。

我还有很多其他类,比如我在主类初始化期间创建的一个圆圈,并按照myCircle = new Circle(); 的行保存在一个局部变量中。

我还制作了一些所有变量和方法都是静态的类。

我注意到我不必在初始化期间创建此类的对象,因为其中的所有内容都是静态的。每当我需要这些课程之一的东西时,我都可以将其称为 StaticClass.someMethod()StaticClass.someVariable

这与我去的圈子 myCircle.anotherMethod() 形成鲜明对比。如果我将该方法设为静态,我可以使用 Circle.anotherMethod()

现在我的问题是:如果我可以将类中的所有内容都设为静态(假设我只需要一个这样的对象),为什么还要创建一个新对象并保存它?

更重要的是:我的一个静态类有大量常量,它们是从文件中读取的图像。由于我还没有制作构造函数,所以我不知道它何时实际加载图像。有几个不同的场合我会打电话给StaticClass.someImage,我想知道它现在是否正在多次从文件中加载图像。

所以我的第二个问题是:Java 什么时候加载没有构造函数的静态类的所有变量? (换句话说,它何时创建该对象?)

【问题讨论】:

    标签: java static


    【解决方案1】:
    1. 这似乎是

      之间的设计选择
      • 一个充满静态变量和方法的类和
      • 单例模式

      在您的情况下,两者都可能有效。尽管答案不应该基于意见,但由于您提供的论点完全相同,我会稍微支持第一选择(与您自己的选择相同):很多静态常量。但是,这将使您的代码具有更 C 风格的程序形式。

      另一方面,如果您不大量使用静态字段,并且不会像使用 Arrays 那样使用类,那么第二个选择会更好;原因是灵活性(多态性就是提供灵活性的一个例子)。

    2. 至于您的第二个问题,加载类时会执行静态代码。例如:

      class MyClass {
          static final int SPEED_OF_LIGHT = 299792458;
          static {
              foo();
          }
      
          static void foo () {
              // ...
          }
      }
      

      上面的方法foo 在加载时执行,不需要任何对象来做它的事情(当然,因为它是静态的)。此外,静态变量也在类加载时初始化。

    【讨论】:

    • 附带说明,因为SPEED_OF_LIGHT 在这里是编译时常量,所以在普通Java 表达式中访问时,它的值将在编译时被复制。这意味着访问MyClass.SPEED_OF_LIGHT 的代码将不会导致MyClass 在运行时被加载,因此不会触发foo() 的执行。
    【解决方案2】:

    第一个问题:一般来说,我认为创建对象而不是使所有内容都成为静态更好,因为您没有使用静态对字段范围进行硬编码。如果您改变了是否需要多个对象的想法,或者如果您想用子类扩展它,您将需要做更多的工作来进行更改,因为您最初设计类时假设该固定范围心里。 (这是判断电话,视情况而定。)

    第二个问题:所有类都有一个构造函数。如果你不指定一个,你会得到一个为你制作的默认值。类的静态变量在加载类时被初始化。一旦加载了一个类,类加载器就不会再次加载它,它会与它第一次找到的内容一起加载。当您的 Web 应用程序依赖于 jar 的多个版本时,加载哪个版本取决于首先引用哪个版本。

    【讨论】:

    • 关于第二个答案:它什么时候加载这个类,它是否多次加载?
    • 这是一个非常有用的问题,但我找不到任何关于一个类是否被多次加载的信息。
    • 每个类加载器加载一个类一次。如果你有多个类加载器,你可能会遇到一个类被多次加载的情况,每次都由不同的类加载器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2012-01-12
    相关资源
    最近更新 更多