对象的初始化顺序: (1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序来的) 1.为父类的静态属性分配空间并赋于初值 1.执行父类静态初始化块; (2)加载子类 2.为子类的静态属性分配空间并赋于初值 2.执行子类的静态的内容; (3)加载父类构造器 3.初始化父类的非静态属性并赋于初值 3.执行父类的非静态代码块; 4.执行父类的构造方法; (4)加载子类构造器 5.初始化子类的非静态属性并赋于初值 5.执行子类的非静态代码块; 6.执行子类的构造方法. 总之一句话,静态代码块内容先执行(父先后子),接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
以下为例:
class Money { public Money() { System.out.println("Money is construct!"); } static{ System.out.println("Money static"); } public static void main(String args[]){ Money obj = new Money(); }
}
输出:Money static Money is construct!
class Dollar extends Money{ public Dollar() { System.out.println("Dollar is construct!"); } static { System.out.println("Dollar static "); } public static void main(String[] args) { new Dollar(); } }
输出:Money static Dollar static Money is construct! Dollar is construct!