java - 创建对象和保持对象静态之间的区别

标签 java static

我有两个关于对象和 Java 中 static 的使用的问题。我发现如果我以相同的背景询问他们,我可以最好地解释我的问题:

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

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

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

我注意到我不必在初始化期间创建此类的对象,因为其中的所有内容都是静态的。每当我需要这些类之一的某些内容时,我可以像 StaticClass.someMethod()StaticClass.someVariable 那样调用它。

这与我所在的圆圈形成对比 myCircle.anotherMethod() 。如果我将该方法设为静态,我就可以使用 Circle.anotherMethod()

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

更重要的是:我的一个静态类有大量常量,它们是从文件中读取的图像。由于我没有制作构造函数,所以我不知道它何时实际加载图像。有几种不同的情况下,我会调用 StaticClass.someImage 并且我想知道它现在是否多次从文件加载图像。

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

最佳答案

  1. 这似乎是一个设计选择

    • 一个充满静态变量和方法的类
    • 单例模式

    根据您的情况,两者都可能有效。尽管答案不应该基于意见,但我会稍微支持第一个选择(与您自己的相同),因为您提供了完全相同的论点:很多静态常量。然而,这将使您的代码变成更 C 风格的过程形式。

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

  2. 关于第二个问题,静态代码在类加载时执行。例如:

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

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

关于java - 创建对象和保持对象静态之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25267086/

相关文章:

java - 通过静态方法修改数组大小

c++ - 如何在 C++ 中仅实例化一个变量一次?

java - Initialization-on-demand holder Idiom 能否导致部分创建的对象?

java - 访问流中上一步的元素或将元素作为 "parameter"传递给下一步?

objective-c - 我可以创建只对我的类可见的 C 函数,它被分成多个文件吗?

python - Robot Framework 中的静态变量

java - 如何捕获Java中的视频和音频?

java - 我的 Android 日志文件中的这些问号是什么?

c# - 为什么支付网关只用Java语言设计?

c++ - 为什么我不能在类中初始化非常量静态成员或静态数组?