Java的初始化过程
在刷题的过程中,时常会碰到关于Java中的类的初始化顺序的问题。
总结如下,便于以后复习:
初始化过程:
- 首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
- 然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
- 其次,初始化父类的普通成员变量和代码块,再执行父类的构造方法;
- 最后,初始化子类的普通成员变量和代码块,再执行子类的构造方法;
举例如下:
class C { C() { System.out.print("C"); } } class A { C c = new C(); A() { this("A"); System.out.print("A"); } A(String s) { System.out.print(s); } } class Test extends A { Test() { super("B"); System.out.print("B"); } public static void main(String[] args) { new Test(); } }
在上面的程序中,new了一个新类Test后,其初始化过程如下:
- 调用构造方法来初始化该子对象,但是因为Test继承自类A,所以需要先调用A的构造方法;
- 在Test的构造方法中通过super("B") 显式调用了父类的带参构造方法,将不再调用其无参构造方法;
- 再执行A的构造方法之前,需要先对其成员变量进行初始化,因此会执行C的构造方法。
- 由此可知,最终的调用顺序为:类C的无参构造——>类A的带参构造——>类Test的构造方法的其余部分。
因此最后输出的结果为:
CBB