这世界上没有优秀的理念,只有脚踏实地的结果 。
大家面试的时候有没有被问到过当我们初始化一个类的时候,类的成员加载顺序是什么?
接下来我们通过一段代码来看一下:
package com.demo_maven.demo_maven.VolatileDemo;
public class ClassLoadDemo {
public static void main(String[] args) {
Son son = new Son();
}
}
class Father {
static {
System.out.println("当前执行------>Father静态块");
}
//定义一个静态变量
static String Name = getName();
static String getName() {
System.out.println("当前执行------>Father静态变量");
return Name;
}
int Age = getAge();
int getAge() {
System.out.println("当前执行------>Father正常变量");
return Age;
}
{
System.out.println("当前执行------>Father正常块");
}
Father() {
System.out.println("当前执行------>Father无参构造函数");
}
}
class Son extends Father {
static String Name = getName();
static String getName() {
System.out.println("当前执行------>Son静态变量");
return Name;
}
int Age = getAge1();
int getAge1() {
System.out.println("当前执行------>Son正常变量");
return Age;
}
static {
System.out.println("当前执行------>Son静态块");
}
{
System.out.println("当前执行------>Son正常块");
}
Son() {
System.out.println("当前执行------>Son无参构造函数");
}
}
执行结果如下:
当前执行------>Father静态块
当前执行------>Father静态变量
当前执行------>Son静态变量
当前执行------>Son静态块
当前执行------>Father正常变量
当前执行------>Father正常块
当前执行------>Father无参构造函数
当前执行------>Son正常变量
当前执行------>Son正常块
当前执行------>Son无参构造函数
由此可以看出静态执行优先于非静态,父类优先于子类。
注意:同级静态变量与静态块,谁先声明谁先执行。
同级正常变量与正常代码块,谁先声明谁先执行。
总结:
1、父类静态变量、静态代码块(先声明的先执行);
2、子类静态变量、静态代码块(先声明的先执行);
3、父类的变量和代码块(先声明的先执行);
4、父类的构造函数;
5、子类的变量和代码块(先声明的先执行);
6、子类的构造函数。