初始化的顺序首先是static(如果它们尚未由前一次对象创建初始化,也就是new对象的时候,只执行一次static变量初始化),变量初始化顺序有变量在类的定义顺序决定的;
对象的创建过程,以Dog类为例:
1.类型为Dog首stati次创建的时候,或者Dog类的stajitic方法/static字段首次访问时,java编译器必须找到Dog.class;
2.找到Dog.class后(它会创建一个Class对象),它的所有static初始化模块都会运行。因此,static初始化仅发生一次-----在Class对象首次载入的时候
3.创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(heap)里为一个Dog对象分配足够多的内存空间;
4.这种空间为情况为0,将Dog中的所有基本类型设为它们的默认值;
5.进行字段定义时发生的所有初始化都会执行;
6.执行构造器
package thinking; //: Beetle.java // The full process of initialization. class Insect { int i = 9; int j; Insect() { prt("i = " + i + ", j = " + j); j = 39; } static int x1 = prt("static Insect.x1 initialized"); static int prt(String s) { System.out.println(s); return 47; } }
继承类
package thinking; public class Beetle extends Insect { int k = prt("Beetle.k initialized"); Beetle() { prt("k = " + k); prt("j = " + j); } static int x2 = prt("static Beetle.x2 initialized"); static int prt(String s) { System.out.println(s); return 63; } public static void main(String[] args) { prt("Beetle constructor"); Beetle b = new Beetle(); } }
执行结果:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 63
j = 39