初始化及类的加载

时间:2021-10-16 19:38:06

1.java中所有事物都是对象,每个类的编译代码都存在于它自己的独立文件中。该文件只在需要使用程序代码时才会被加载。一般来说,可以说:“类的对象在初次使用时才加载。”这通常是指加载发生于创建类的第一个对象之时,但是当访问static域或者static方法时,也会发生加载 。

初次使用之处也是static初始化发生之处。所有的static对象和static代码段都会在加载时依照程序中的顺序而依次初始化。注意,static的东西只会初始化一次。

<span style="font-size:14px;">package com.dqpi.cn;

class Animal{
private int age = 20;
protected int legs = 4;
public Animal() {
System.out.println("age=" + age +",legs=" + legs);
legs = 2;
}
private static int x1 = printInit("static animal.x1 initialized");
static int printInit(String s){
System.out.println(s);
return 47;
}
}
public class Dog extends Animal{
private int k = printInit("Dog.k initialized");
public Dog(){
System.out.println("k=" + k);
System.out.println("legs=" + legs);
}
private static int x2 = printInit("static dog.x2 initialized");
public static void main(String[] args) {
System.out.println("dog constructor");
Dog d = new Dog();
}

}
</span>
运行结果:

<span style="font-size:14px;">static animal.x1 initialized
static dog.x2 initialized
dog constructor
age=20,legs=4
Dog.k initialized
k=47
legs=2
</span>
对上述的代码做以下的简单解释:当运行程序后,访问Dog.main()方法时,类加载器开始启动并找出该类的编译代码,在对他进行加载的过程中,编译器发现他有父类,因此继续进行加载,假设该父类还有父类,则继续会加载该父类的基类,依次类推。接下来,会加载根基类的static初始化,static会被执行,然后执行其子类中的static,依次类推,知道所有子类中的static执行完,才开始对象的创建,首先对象中所有的基本类型都会被设置为默认值,对象引用被设为null(这是通过将对象内存设为二进制零值而一举生成)。然后,基类的构造器就会被调用。基类的构造器和子类的构造器一样,以相同的顺序来经历相同的过程,在基类的构造器完成之后,实例变量按照其次序被初始化,最后构造器的其余部分被执行。

2.初始化的顺序

1)在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零

2)调用基类的构造器。这个步骤会不断地反复递归下去,首先是构造这种层次结构的根,然后是下一层的子类,等等,直到最低层的子类。

3)调用子类构造器的主体