类的代码在初次使用时才加载(每个类的编译代码都存在于它自己的独立文件中,.class文件),是指加载发生在创建类的第一个对象的时候,但是当访问static方法和static域的时候,也会发生加载(构造器也是static方法,只是static关键字没有显式的写出来)。类初次使用时也是static初始化的时候,所有的static对象和static代码段都会在加载时按照程序中的顺序(类中代码的书写顺序)依次初始化。static的对象或代码都只会初始化一次。而非静态代码块是在创建类的对象时顺序执行的。
对于继承关系,在实例化一个类时,如果它存在父类,那么父类会先进行加载(按顺序执行static对象和static代码),如果此父类还有父类那么按照此规则先进行类的加载,然后是子类的加载(同样是按顺序执行static对象和static代码),待类加载都结束后,即可开始创建对象。
创建对象时,首先是父类的基本类型被设置默认值,对象引用被设为null,非静态代码块的执行(前面的过程按照写代码的顺序),然后构造器会被自动调用,接着子类的的基本类型被设置默认值,对象引用被设为null,非静态代码块的执行(前面的过程按照写代码的顺序),然后构造器会被调用,对象创建完成。
代码示例如下:
public class A {
{
System.out.println("F");
}
private int i = 0;
static {
System.out.println("A");
}
{
System.out.println(i);
}
public A(String temp) {
this(temp, null);
}
public A(String temp1, String temp2) {
System.out.println("X");
}
}
public class B extends A {
private int j = get();
static {
System.out.println("B");
}
private int get() {
System.out.println("get");
return 1;
}
{
System.out.println("j2 = " + j);
}
{
System.out.println("D");
}
public B() {
super("nihao", "pengyou!");
System.out.println("j1 = " + j);
}
public static void main(String[] args) {
B b = new B();
}
}
执行结果:
A
B
F
0
X
get
j2 = 1
D
j1 = 1