繁体   English   中英

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

[英]what happens to static block when we create multiple objects?

我有一类具有静态成员,也有非静态成员的类:

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 restrictednumber of object creation is not restricted并且可以在使用new关键字创建的对象的帮助下访问非静态方法。

静态方法或成员变量也可用于每个实例,并且无需创建对象即可对其进行访问。

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

谢谢。

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

假设您有A,B和C类。

您已经在A中初始化了一个称为“ dataArray”的静态数组。

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

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

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

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

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,编译器也不会给出null指针,因为它不需要对象引用来调用静态方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM