Java对象初始化顺序
一、无继承情况
静态变量、初始化块→非静态变量、初始化块→构造函数
示例:Base类
class Base{ public static String baseStaticStr="静态变量"; { System.out.println("Base.非静态初始化块()"); } static{ System.out.println("Base."+baseStaticStr); System.out.println("Base.静态初始化块()"); } public Base() { // TODO Auto-generated constructor stub System.out.println("Base.构造器():"); } }
建立测试类:
public class InitOrder { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Base base=new Base(); } }
输出结果:
Base.静态变量
Base.静态初始化块()
Base.非静态初始化块()
Base.构造器()
二、有继承的情况
父类的静态变量、初始化块→子类的静态变量、初始化块→父类的非静态变量、初始化块→父类的构造函数→子类的非静态变量、初始化块→子类的构造函数
添加子类:
class Child extends Base{ public static String childsString="静态变量"; { System.out.println("Child.非静态初始化块()"); } static{ System.out.println("Child."+childsString); System.out.println("Child.静态初始化块()"); } public Child(){ System.out.println("Child.构造器()"); } }
测试代码:
public class InitOrder { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Child child=new Child(); } }
输出结果:
Base.静态变量
Base.静态初始化块()
Child.静态变量
Child.静态初始化块()
Base.非静态初始化块()
Base.构造器()
Child.非静态初始化块()
Child.构造器()