java - static 修饰符如何影响这段代码?

标签 java static

这是我的代码:

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. 执行

  1. 识别阶段检测所有静态变量并使用默认值初始化。

    所以现在的值是:
    A obj=null
    num1=0
    num2=0

  2. 第二阶段,执行,从上到下开始。在 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/

相关文章:

Java 正则表达式检查迷宫的有效字符

java - 为什么下面的代码会出错

java - 在 Java 中继承一个静态变量

c# - 在 C# 中初始化静态变量内联或静态构造函数的区别

java - Java 中动态和静态类型分配之间的区别

java - jMonkey优化类似于Java3D的

java - Gwt 中的多个 Html 页面

java - 向数组添加边框

c++ - 静态存储和大对象

C++ - 如何从同一类的静态函数访问类的私有(private)成员?