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

jei2mxaa  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(104)
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");
    }
}

源代码如上所述,我知道类的加载顺序,这是静态变量〉〉静态代码块〉〉成员变量〉〉构造代码块〉〉构造方法
公共静态静态测试t1 =新静态测试(“t1”);
执行,为什么静态代码块没有运行
static{ print("静态块"); }
但是
公共整数j =打印(“j”);
跑了?里面发生了什么?我希望你能告诉我一些事情,我会很感激的。

b1payxdu

b1payxdu1#

在那里你不需要做static callnew Object()“方法”调用constructor,并且永远不是static

xdyibdwo

xdyibdwo2#

程序的输出:

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行。

相关问题