一直以来我我认为这三者的执行顺序是静态代码块、非静态代码块、构造函数。
网上搜了下也都是这么说的。
就像下面这段代码:
Java代码
1.public class ExA {
2. static {
3. System.out.println("父类--静态代码块");
4. }
5.
6. public ExA() {
7. System.out.println("父类--构造函数");
8. }
9.
10. {
11. System.out.println("父类--非静态代码块");
12. }
13.
14. public static void main(String[] args) {
15. new ExB();
16. }
17.}
18.
19.class ExB extends ExA {
20. static {
21. System.out.println("子类--静态代码块");
22. }
23. {
24. System.out.println("子类--非静态代码块");
25. }
26.
27. public ExB() {
28. System.out.println("子类--构造函数");
29. }
30.}
public class ExA {
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
执行结果
=====
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
可是静态代码块真的会一定在非静态代码块之前执行吗?
下面这段代码
Java代码
1.public class ExA {
2. private static ExA a = new ExA();
3. static {
4. System.out.println("父类--静态代码块");
5. }
6.
7. public ExA() {
8. System.out.println("父类--构造函数");
9. }
10.
11. {
12. System.out.println("父类--非静态代码块");
13. }
14.
15. public static void main(String[] args) {
16. new ExB();
17. }
18.}
19.
20.class ExB extends ExA {
21. private static ExB b = new ExB();
22. static {
23. System.out.println("子类--静态代码块");
24. }
25. {
26. System.out.println("子类--非静态代码块");
27. }
28.
29. public ExB() {
30. System.out.println("子类--构造函数");
31. }
32.}
public class ExA {
private static ExA a = new ExA();
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
private static ExB b = new ExB();
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public ExB() {
System.out.println("子类--构造函数");
}
}
执行结果
=====
父类--非静态代码块
父类--构造函数
父类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
=====
可以发现非静态代码块并不是一定在静态代码块之后执行的。
我认为此时private static ExA a = new ExA()是静态变量。而java里面静态变量与静态代码块是按代码先后顺序执行
。所以就导致非静态代码块在静态代码块之前执行。
|