我有一个类,它有静态成员,也有非静态成员,如:
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
关键字创建对象时,这些静态块会发生什么。
感谢。
答案 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,编译器也不会给出空指针,因为它不需要对象引用来调用静态方法。