当我们创建多个对象时,静态块会发生什么?

时间:2014-02-06 05:31:37

标签: java oop object static

我有一个类,它有静态成员,也有非静态成员,如:

public class StaticClassObjectCreations {
    public static void doSomeThing() {
        // TODO implementations static
    }

    public void nonStaticMethod() {
        // TODO implementations for non static
    }

    public static void main(String[] args) {

        StaticClassObjectCreations obj = new StaticClassObjectCreations();
        StaticClassObjectCreations obj1 = new StaticClassObjectCreations();


    }

}

我们可以看到number of object creation is not restricted,并且可以借助使用new关键字创建的对象访问非静态方法。

静态方法或成员变量也可用于每个实例,也可以在不创建对象的情况下访问它们。

现在我的问题是:JVM如何维护静态代码块的实例,换句话说,在使用new关键字创建对象时,这些静态块会发生什么。

感谢。

3 个答案:

答案 0 :(得分:8)

静态块/变量/方法属于Class,而不属于该Class的实例。它们将在加载类时初始化。创建类的实例时,这些不会对这些产生任何影响。即使您从实例调用静态成员,编译器也会将其替换为Class。

答案 1 :(得分:2)

假设您有A,B和C类。

您已在A。

中初始化了一个名为“dataArray”的静态数组

您在B中创建了A的实例(对象),在C中创建了一个实例。

这两个对象的初始化不会影响A中的“dataArray”,因为它是静态的。它将为B和C中的对象保存相同的数据。这是因为静态变量和方法是在类级别而不是对象级别。

注意:这是基于我的实验。如果我错了,请回复。

答案 2 :(得分:1)

如果您的问题是关于编译器如何使用对象引用处理静态方法调用,

public class StaticClassObjectCreations {

    public static void doSomeThing() {
        System.out.println("here");
    }
    public static void main(String[] args) {
        StaticClassObjectCreations obj = null;
        obj.doSomeThing();
        StaticClassObjectCreations.doSomeThing();
    }

}

编译器用对应的类替换对象引用以调用静态方法。即使obj为null,编译器也不会给出空指针,因为它不需要对象引用来调用静态方法。