通过new新建一个对象时,涉及到类的装载及对象的实例化两方面。
1、类的装载
??? 1)类装载时,先装载父类,然后到子类。
??? 2)装载父类后,执行静态动作(初始化静态变量或执行静态代码程序(两者根据代码顺序执行))。
??? 3)装载子类后,执行静态动作(初始化静态变量或执行静态代码程序(两者根据代码顺序执行))。
?
2、对象的实例化
??? 1)实例化子类时,会(需要)先实例化父类。
??? 2)实例化父类时,先完成实例变量的初始化,然后调用构造函数完成实例化工作,子类同理。
?
3、概括来说,初始化顺序如下:
??? 父类的静态代码?-->子类的静态代码-->父类的非静态实例变量(或代码块)-->父类的构造方法-->子类的非静态实例变量(或代码块)-->子类的构造方法。
?
4、测试实例
class="java">abstract class base { public int age = getNumber(100); static { System.out.println("base static block"); } { System.out.println("base nonstatic block"); } static int sage = getNumber(50); base() { System.out.println(age); System.out.println("base start"); draw();// 会调用子类覆盖后的方法,这儿是0!???? System.out.println("base end"); } static int getNumber(int base) { System.out.println("base.getNumber int" + base); return base; } public void draw() { System.out.println("base.draw"); } } public class initializeOrder extends base { public int age = getNumber(1001); private int _radius = getNumber(10); static int sage = getNumber(250); static { System.out.println("subclass static block"); } { System.out.println("subclass nonstatic block"); } initializeOrder(int radius) { _radius = radius; System.out.println(age); draw();// 这儿是1000 System.out.println("initializeOrder initialized"); } public void draw() { System.out.println("initializeOrder.draw " + _radius); } public static void main(String[] args) { new initializeOrder(1000); } }
??? 执行输出如下:
??? base static block
??? base.getNumber int50
??? base.getNumber int250
??? subclass static block
??? base.getNumber int100
??? base nonstatic block
??? 100
??? base start
??? initializeOrder.draw 0
??? base end
??? base.getNumber int1001
??? base.getNumber int10
??? subclass nonstatic block
??? 1001
??? initializeOrder.draw 1000
??? initializeOrder initialized