这是我的代码:
class A {
static A obj = new A();
static int num1;
static int num2=0;
private A() {
num1++;
num2++;
}
public static A getInstance() {
return obj;
}
}
public class Main{
public static void main(String[] arg) {
A obj = A.getInstance();
System.out.println(obj.num1);
System.out.println(obj.num2);
}
}
输出是1 0
,但是看不懂。
谁能给我解释一下?
最佳答案
在 Java 中发生两个阶段:1. 识别,2. 执行
在识别阶段检测所有静态变量并使用默认值初始化。
所以现在的值是:
A obj=null
num1=0
num2=0
第二阶段,执行,从上到下开始。在 Java 中,执行从第一个静态成员开始。
这里你的第一个静态变量是static A obj = new A();
,所以首先它将创建该变量的对象并调用构造函数,因此num1
的值num2
变成1
。
然后,再次执行static int num2=0;
,这使得num2 = 0;
.
现在,假设你的构造函数是这样的:
private A(){
num1++;
num2++;
System.out.println(obj.toString());
}
这将抛出 NullPointerException
,因为 obj
仍然没有得到 class A
的引用。
关于java - static 修饰符如何影响这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20115672/