package com.Test; public class Test1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("------------------第一次实例化对象--------------------"); Parent parent = new Child(); System.out.println("——————————————————第二次实例化对象————————————————————"); parent=new Child(); } } class Parent { public static StaticVarible staticVarible = new StaticVarible("父类-静态变量1"); public StaticVarible instVarible = new StaticVarible("父类-成员变量1"); static { System.out.println("父类-静态块"); } { System.out.println("父类-初始化块"); } public Parent() { System.out.println("父类-实例构造函数"); } } class Child extends Parent { public static StaticVarible staticVarible = new StaticVarible("子类-静态变量1"); public StaticVarible instVarible = new StaticVarible("子类-成员变量1"); static { System.out.println("子类-静态块"); } public Child() { System.out.println("子类-实例构造函数"); } { System.out.println("子类-初始化块"); } } class StaticVarible { public StaticVarible(String info) { System.out.println(info); } }
第一次实例化对象
父类-静态变量1
父类-静态块
子类-静态变量1
子类-静态块
父类-成员变量1
父类-初始化块
父类-实例构造函数
子类-成员变量1
子类-初始化块
子类-实例构造函数
——————————————————第二次实例化对象————————————————————
父类-成员变量1
父类-初始化块
父类-实例构造函数
子类-成员变量1
子类-初始化块
子类-实例构造函数
结论:
从上述结果可以看出,在实例化一个对象时,各部分的加载顺序如下:
父类静态成员/父类静态初始化块 -> 子类静态成员/子类初始化块 -> 父类成员变量/父类初始化块 -> 父类构造函数 -> 子类成员变量/子类初始化块 -> 子类构造函数
静态代码块和静态成员只有类首次加载进内存时调用一次,只此一次。
非静态代码块和成员,每次创建对象时,会在构造函数之前被调用。
构造函数,每次创建对象时,最后调用。
创建子类对象时,先创建父类对象,再创建子类对象。