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

时间:2014-08-12 14:35:44

标签: java static

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

我的课程中有一个主要课程。首先,它初始化很多东西,然后启动run方法,循环一段时间(真实)循环。

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

第一个问题:一般来说,我认为创建一个对象更好的风格而不是让一切都是静态的,因为你没有使用静态对字段的范围进行硬编码。如果您改变主意是否需要多个对象,或者想要使用子类扩展它,那么您将需要做更多的工作来进行更改,因为您最初设计的类具有固定范围的假设心里。 (这是判断,这取决于具体情况。)

第二个问题:所有类都有一个构造函数。如果您没有指定一个,那么您将获得一个默认的。加载类时,类的静态变量会被初始化。加载一个类后,类加载器不再加载它,它与第一次发现的一样。如果您的Web应用程序对jar的多个版本有依赖性,那么加载哪个版本取决于首先引用的版本。

答案 1 :(得分:1)

  1. 这似乎是

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

    在你的情况下,两者都可行。虽然答案不应该基于意见,但我会稍微赞成第一种选择(与你自己的相同),因为你提供了完全相同的参数:很多静态常量。但是,这将使您的代码更加C风格,程序化。

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

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

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

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