Java静态代码块的问题

自己测试的一点小例子,觉得有点充数的嫌疑


劳动节嘛就是劳动的节日(大雾

晚上把之前iteye里面的东西搬过来了,虽然很惭愧原本就没有写多少东西。

(不过搬完发现,之前写的东西真的看不下去啊,,TM,就搬一个好了


在查看别人代码的时候 看到了 static静态代码块 ?之后经过搜索和自己的亲试,下面贴出测试代码和解释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class TestA {
static {
System.out.println("父类--静态代码块");
}
public TestA() {
System.out.println("父类--构造方法");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new TestB();
}
}
class TestB extends TestA {
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public Test() {
System.out.println("子类--构造方法");
}
}

跑起来的结果是:

父类–静态代码块

子类–静态代码块

父类–非静态代码块

父类–构造方法

子类–非静态代码块

子类–构造方法

在这个代码中,代码的执行顺序,就是 在主类中首先执行static静态代码块中的代码,同理,之后在主函数中 建立了TestB对象,在执行构造函数之前,首先查看TestB中是否有static静态块,之后首先执行了静态代码块中的代码。当TestB的静态代码 块执行完毕之后,它接着又去看A有没有非静态代码块,如果有就执行A类的非静态代码块,A的非静态代码块执行完毕,接着执行A的构造方法;A的构造方法执 行完毕之后,它接着去看B有没有非静态代码块,如果有就执行B的非静态代码块。B类的非静态代码块执行完毕再去执行B类的构造方法,这个就是一个对象的初 始化顺序。
噫,,写出来了好像挺麻烦的。。大致就是 1静态代码块 ?–>2非静态代码块 ?–>3构造方法

然后进行了有一个测试:

这个测试是测试是否一定是静态块先执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class TestA2 {
private static TestA2 a = new TestA2();
static {
System.out.println("父类--静态代码块");
}
public TestA2() {
System.out.println("父类--构造方法");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new TestB2();
}
}
class TestB2 extends TestA2 {
private static TestB2 b = new TestB2();
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public TestB2() {
System.out.println("子类--构造方法");
}
}

结果如下:

父类–非静态代码块

父类–构造方法

父类–静态代码块

父类–非静态代码块

父类–构造方法

子类–非静态代码块

子类–构造方法

子类–静态代码块

父类–非静态代码块

父类–构造方法

子类–非静态代码块

子类–构造方法

这里先new了一个 静态的对象

1
private static TestA2 a = new TestA2();

而 在静态代码块和创建静态对象时,是按照 代码的顺序执行的,就是说 需要执行完 这个创建对象的语句才能执行下面的 静态代码块中的语句。所以给人的感觉像是“跳过了”静态代码块,所以一开始是:1非静态代码块2构造方法。之后执行完了 创建对象的语句,继续执行,即静态代码块。之后就是在主类中创建一个TestB2对象,像上面的测试一样,不同的也只是在执行创建对象语句静态代码块和顺 序的问题。而执行了两次非静态代码和构造方法的原因就是,一次是创建静态对象时,一次是执行完静态方法后的执行。

总结:

对 象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静 态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非 静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静 态代码块和构造方法,然后执行子类非静态代码块和构造方法。