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”);
跑了?里面发生了什么?我希望你能告诉我一些事情,我会很感激的。
2条答案
按热度按时间b1payxdu1#
在那里你不需要做
static call
,new Object()
“方法”调用constructor
,并且永远不是static
。xdyibdwo2#
程序的输出:
Java在调用
main
方法之前首先从顶部开始执行静态初始化,这是正确的。此时,即使静态初始化还没有完成,
t1
示例的创建就开始了。我想我永远不敢在我的代码中依赖这样的东西。无论如何,构造t1
涉及初始化j
和运行非静态初始化块(print("构造块");
)和构造函数;这将在输出中产生行1到行3。构造t2
将产生行4到行6。静态初始化继续
i
(第7行)、n
,然后是静态初始化器块(第8行)。最后调用
main()
,再创建一个对象,它依次给出第9到11行。