Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序
2017-03-27 14:49
615 查看
实例化子类时,父类与子类中的静态代码块、实例代码块、静态变量、实例变量、构造函数的执行顺序是怎样的?
代码执行的优先级为:
firest:静态部分
second:实例化过程
详细顺序为:
1.父类静态代码块与父类静态变量(取决于代码书写顺序)
2.子类静态代码块与子类静态变量(取决于代码书写顺序)
3.父类实例变量与父类代码块(取决于代码书写顺序)
4.父类构造函数
5.子类实例变量与父类代码块(取决于代码书写顺序)
6.子类构造函数
在JVM加载完类以后,类在被使用的时候初始化,静态部分只在类初始化的时候执行一次。
测试代码:
[java] view plain copy
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;
}
}
调用代码:
[java] view plain copy
new Thread(new Runnable() {
@Override
public void run() {
new Child();
LogUtil.log("分隔符 ------ 分隔符");
new Child();
}
}).start();
执行结果:
[plain] view plain copy
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: 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 ------ 子类构造函数
代码执行的优先级为:
firest:静态部分
second:实例化过程
详细顺序为:
1.父类静态代码块与父类静态变量(取决于代码书写顺序)
2.子类静态代码块与子类静态变量(取决于代码书写顺序)
3.父类实例变量与父类代码块(取决于代码书写顺序)
4.父类构造函数
5.子类实例变量与父类代码块(取决于代码书写顺序)
6.子类构造函数
在JVM加载完类以后,类在被使用的时候初始化,静态部分只在类初始化的时候执行一次。
测试代码:
[java] view plain copy
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;
}
}
调用代码:
[java] view plain copy
new Thread(new Runnable() {
@Override
public void run() {
new Child();
LogUtil.log("分隔符 ------ 分隔符");
new Child();
}
}).start();
执行结果:
[plain] view plain copy
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: 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 ------ 子类构造函数
相关文章推荐
- Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序
- 关于静态变量,静态代码块,实例变量,实例代码块,构造函数的执行顺序的总结
- 【JAVA】探究JAVA父类子类静态代码块、静态变量、构造方法的执行顺序
- JAVA父类子类静态代码块、静态变量、构造方法的执行顺序
- Java初始化顺序总结及其程序执行过程图- 静态变量、静态代码块、成员变量、构造函数
- java继承中父类和子类静态、非静态代码块,构造函数,静态方法的执行顺序
- 关于静态变量,静态代码块,实例变量,实例代码块,构造函数的执行顺序
- java中父类和子类中的静态代码块、非静态代码块和构造器的执行顺序
- Java 父类的构造函数执行要早于子类的实例变量初始化
- java 中的 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块 执行时机
- Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数
- JAVA中父类与子类静态代码块、非静态代码块、构造函数的加载顺序
- java 中的 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块 执行时机
- Java 静态变量、非静态代码块、构造函数的执行顺序
- java 父类访问子类对象的实例变量 继承过程中的执行顺序
- java 父类子类静态成员,实例成员,构造函数初始化的顺序
- 继承中,父类与子类都有静态代码块和构造函数的时执行顺序
- [C#]父类与子类的静态成员变量、实例成员变量、构造函数的执行顺序
- java中 静态成员、实例成员、构造方法在子类和父类中的执行顺序
- java 中的 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块 执行时机