java类的初始化顺序
有关java类的初始化顺序:
最重要的有两点 :
1. 父类初始化顺序优先于子类
2. . 静态的初始化优先于非静态
但是记忆中具体的顺序总是和实际的初始化顺序有些许的出入,为了加深记忆和理解,
自己专门写了一个类来测试类的初始化顺序
本篇博客相关的代码已经上传到了github中:
github项目链接:
本篇博客涉及代码的github链接
测试代码如下:
/**
* @author xmr
* @date 2019/2/28 10:48
* @description
*/
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoaderSon classLoaderSon = new ClassLoaderSon();
}
static TestDemo testDemo = new TestDemo();
TestDemo testDemo2 = new TestDemo(2);
static {
System.out.println("初始化父类静态代码块");
}
ClassLoaderTest(){
System.out.println("初始化父类构造方法");
}
{
System.out.println("初始化父类构造代码块");
}
}
class ClassLoaderSon extends ClassLoaderTest
{
static TestDemoSon testDemoSon = new TestDemoSon();
TestDemoSon testDemoSon2 = new TestDemoSon(2);
static {
System.out.println("初始化子类静态代码块");
}
ClassLoaderSon()
{
System.out.println("初始化子类构造方法");
}
{
System.out.println("初始化子类构造代码块");
}
}
class TestDemo {
TestDemo() {
System.out.println("初始化父类静态变量");
}
TestDemo(int x)
{
System.out.println("初始化父类成员变量");
}
}
class TestDemoSon {
TestDemoSon()
{
System.out.println("初始化子类静态变量");
}
TestDemoSon(int x)
{
System.out.println("初始化子类成员变量");
}
}
程序执行结果如下:
由此可以得到,java的类初始化顺序是 :
1. 父类的静态变量,父类的静态代码块(谁在上面就先初始化谁)
2. 子类的静态变量,子类的静态代码块(谁在上面就先初始化谁)
3. 父类成员变量
4. 父类的构造代码块
5. 父类的构造函数
6. 子类成员变量
7. 子类的构造代码块
8. 子类的构造函数