我有两个关于对象和 Java 中 static 的使用的问题。我发现如果我以相同的背景询问他们,我可以最好地解释我的问题:
我的程序中有一个主类。首先它初始化很多东西,然后启动 run 方法,该方法循环通过 while (true) 循环。
我还有很多其他类,例如我在主类初始化期间创建的一个圆,并按照 myCircle = new Circle(); 的方式保存在局部变量中> .
我还制作了一些类,其中所有变量和方法都是静态的。
我注意到我不必在初始化期间创建此类的对象,因为其中的所有内容都是静态的。每当我需要这些类之一的某些内容时,我可以像 StaticClass.someMethod()
或 StaticClass.someVariable
那样调用它。
这与我所在的圆圈形成对比 myCircle.anotherMethod()
。如果我将该方法设为静态,我就可以使用 Circle.anotherMethod()
。
现在我的问题是:如果我可以使该类中的所有内容都是静态的(假设我只需要一个这样的对象),为什么要创建一个新对象并保存它?
更重要的是:我的一个静态类有大量常量,它们是从文件中读取的图像。由于我没有制作构造函数,所以我不知道它何时实际加载图像。有几种不同的情况下,我会调用 StaticClass.someImage
并且我想知道它现在是否多次从文件加载图像。
所以我的第二个问题是:Java什么时候加载没有构造函数的静态类的所有变量? (换句话说,它什么时候创建该对象?)
最佳答案
这似乎是一个设计选择
- 一个充满静态变量和方法的类
- 单例模式
根据您的情况,两者都可能有效。尽管答案不应该基于意见,但我会稍微支持第一个选择(与您自己的相同),因为您提供了完全相同的论点:很多静态常量。然而,这将使您的代码变成更 C 风格的过程形式。
另一方面,如果您不大量使用静态字段,并且您不会像使用
Arrays
那样使用您的类,那么第二个选择更好;原因是灵 active (多态性是提供灵 active 的一个例子)。关于第二个问题,静态代码在类加载时执行。例如:
class MyClass { static final int SPEED_OF_LIGHT = 299792458; static { foo(); } static void foo () { // ... } }
上面的方法
foo
在加载时执行,并且不需要任何对象来完成它的事情(当然,因为它是静态的)。此外,静态变量也在类加载时初始化。
关于java - 创建对象和保持对象静态之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25267086/