Java
代码执行顺序:main
方法,类初始化过程,类实例化过程。
main
方法
规则
- 如果当前类作为
Java
程序运行,则main
是程序的入口方法 - 如果当前类仅仅作为类实例,则
main
方法和普通static
方法一样,只有主动调用时才会执行
示例
1 | // 1. 程序入口 |
Java
代码执行顺序
执行顺序理论基础,参考:Java 类加载机制
规则
- 类初始化过程:静态成员,静态代码块
- 类实例化过程:即调用构造方法生成实例时
- 普通成员,构造块
- 然后构造方法
类初始化过程中,可能调用了实例化过程(因为
static
可以修饰方法,属性,代码块,内部类),此时则会暂停类初始化过程而先执行实例化过程(被打断),执行结束后再进行类初始化过程。
示例
下面就是典型的暂停类初始化示例:
1 | public class TestExecSequence { |
所有成员变量在初始化前都是默认初始值。
代码解析:
- 成员变量默认值:
k = i = n = j = 0
- 代码顺序执行,初始化
k = 0
- 出现类初始化暂停,
t1
执行实例化过程 t1
实例化过程中,先执行成员变量初始化j
,再执行构造代码块,最后执行构造方法t1
实例化完后,恢复类初始化过程,接着遇到了t2
实例化,继续暂停类初始化,执行t2
实例化过程- 同
t1
实例化一样,依次初始化j
,构造代码块,构造方法 - 恢复类初始化,静态成员变量初始化
i
和n = 99
- 继续类初始化,执行静态代码块
- 所有静态成员和静态代码块执行完后,进入程序
main
方法 - 在
main
中,实例化t
,依次执行初始化j
,构造代码块,构造方法
子类实例化顺序
规则
子类实例化时会先实例化父类,代码执行顺序基本上参考上面的规则,但是父类先执行,具体如下:
- 父类类初始化过程:静态成员变量,静态代码块
- 子类类初始化过程:静态成员变量,静态代码块
- 父类类实例化过程:普通成员变量,构造代码块,最后父类的构造方法
- 子类类实例化过程:普通成员变量,构造代码块,最后子类的构造方法
static
静态成员变量和方法是属于类的,所以只会在类初始化时初始化或执行一次,类在多次实例化时不会重复执行。
示例
1 | // 1. Father |