为什么加载中的这种类型的静态变量不需要调用静态代码块

时间:2017-03-09 13:05:06

标签: java static

public class StaticTest {

    public static int k = 0;
    public static StaticTest t1 = new StaticTest("t1");
    public static StaticTest t2 = new StaticTest("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");

    {
        print("构造块");
    }

    static {
        print("静态块");
    }

    public StaticTest(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n + " this:" + this);
        ++n;
        ++i;
    }

    public static int print(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
        ++i;
        return ++n;
    }

    public static void main(String[] args) {
        new StaticTest("init");
    }
}

上面的源代码,我知道了类加载顺序,即静态变量>>静态代码块>>成员变量>>构造的代码块>>构造方法。当我感到困惑时

  

public static StaticTest t1 = new StaticTest(" t1");

执行,为什么静态代码块(

  

静态{           打印("静态块&#34);       }

)没跑,但是

  

public int j = print(" j");

然?发生了什么事?我希望你能告诉我一些事情,我会很感激。

2 个答案:

答案 0 :(得分:0)

你那里没有static callnew Object()“方法”会调用constructor,而不是static

答案 1 :(得分:0)

程序输出:

1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2 this:mypackage.StaticTest@6d06d69c
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5 this:mypackage.StaticTest@7852e922
7:i i=6 n=6
8:静态块 i=7 n=99
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102 this:mypackage.StaticTest@4e25154f

你是正确的,Java在调用main方法之前首先从顶部开始进行静态初始化。

时,情况会变得复杂一些
public static StaticTest t1 = new StaticTest("t1");

此时,即使静态初始化未完成,也会开始创建t1实例。我认为我不敢依赖在我的代码中使用这样的东西。无论如何,构造t1涉及初始化j并运行非静态初始化块(print("构造块");)和构造函数;这会在输出中生成第1行到第3行。构造t2会产生第4到第6行。

静态初始化继续i(第7行),n,然后是静态初始化程序块(第8行)。

最后调用main(),再创建一个对象,然后为你提供9到11行。