静态代码块、非静态代码块、构造函数三者的执行顺序是:- public class 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 {
- static {
- System.out.println("子类--静态代码块");
- }
- {
- System.out.println("子类--非静态代码块");
- }
-
- public ExB() {
- System.out.println("子类--构造函数");
- }
- }
复制代码 执行结果
=====
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
可是静态代码块真的会一定在非静态代码块之前执行吗?
下面这段代码- 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里面静态变量与静态代码块是按代码先后顺序执行。所以就导致非静态代码块在静态代码块之前执行。 |