实例化子类时,父类与子类中的静态代码块、实例代码块、静态变量、实例变量、构造函数的执行顺序是怎样的?
代码执行的优先级为:
firest:静态部分
second:实例化过程
详细顺序为:
1.父类静态代码块与父类静态变量(取决于代码书写顺序)
2.子类静态代码块与子类静态变量(取决于代码书写顺序)
3.父类实例变量与父类代码块(取决于代码书写顺序)
4.父类构造函数
5.子类实例变量与父类代码块(取决于代码书写顺序)
6.子类构造函数
在JVM加载完类以后,类在被使用的时候初始化,静态部分只在类初始化的时候执行一次。
测试代码:
class Father {
Father() {
LogUtil.log(System.currentTimeMillis() + " ------ 父类构造函数");
}
static {
LogUtil.log(System.currentTimeMillis() + " ------ 父类静态代码块");
}
long x = getTime(" ------ 父类实例变量");
{
long time = System.currentTimeMillis();
LogUtil.log(time + " ------ 父类代码块");
}
static long y = getTime(" ------ 父类静态变量");
static long getTime(String who) {
long time = System.currentTimeMillis();
LogUtil.log(time + who);
return time;
}
}
class Child extends Father {
Child() {
LogUtil.log(System.currentTimeMillis() + " ------ 子类构造函数");
}
static long y = getTime(" ------ 子类静态变量");
static {
LogUtil.log(System.currentTimeMillis() + " ------ 子类静态代码块");
}
{
long time = System.currentTimeMillis();
LogUtil.log(time + " ------ 子类代码块");
}
long x = getTime(" ------ 子类实例变量");
static long getTime(String who) {
long time = System.currentTimeMillis();
LogUtil.log(time + who);
return time;
}
}
调用代码:
new Thread(new Runnable() {
@Override
public void run() {
new Child();
LogUtil.log("分隔符 ------ 分隔符");
new Child();
}
}).start();
执行结果:
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类静态代码块
11-03 20:02:03.35
0 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类静态变量
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类静态变量
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类静态代码块
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类实例变量
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类代码块
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类构造函数
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类代码块
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类实例变量
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类构造函数
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 分隔符 ------ 分隔符
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类实例变量
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类代码块
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类构造函数
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类代码块
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类实例变量
11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类构造函数
本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6626700.html,如需转载请自行联系原作者