初始化考察
初始化考察
class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
}
class Tableware {
static Bowl bowl7 = new Bowl(7);
static {
System.out.println("Tableware静态代码块");
}
Tableware() {
System.out.println("Tableware构造方法");
}
Bowl bowl6 = new Bowl(6);
}
class Table extends Tableware {
{
System.out.println("Table非静态代码块_1");
}
Bowl bowl5 = new Bowl(5);
{
System.out.println("Table非静态代码块_2");
}
static Bowl bowl1 = new Bowl(1);
static {
System.out.println("Table静态代码块");
}
Table() {
System.out.println("Table构造方法");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard extends Tableware {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard构造方法");
}
void otherMethod(int marker) {
System.out.println("otherMethod(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String args[]) {
System.out.println("main()");
cupboard.otherMethod(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
测试结果
Bowl(7) Tableware静态代码块 Bowl(1) Table静态代码块 Bowl(2) Bowl(6) Tableware构造方法 Table非静态代码块_1 Bowl(5) Table非静态代码块_2 Table构造方法 Bowl(4) Bowl(5) Bowl(6) Tableware构造方法 Bowl(3) Cupboard构造方法 main() otherMethod(1)
1)在类的内部,变量定义的先后顺序决定了初始化顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造方法)被调用之前得到初始化。
2)
3)静态初始化只有在必要时刻才进行,例如:类里面的静态变量,只有当类被调用时才会初始化(执行),并且静态变量不会再次被初始化(执行),即静态变量只会初始化(执行)一次。
4)初始化的顺序是先静态对象,然后是非静态对象。
5)当有父类时,完整的初始化顺序为:父类静态变量(静态代码块)->子类静态变量(静态代码块)->父类非静态变量(非静态代码块)->父类构造器 ->子类非静态变量(非静态代码块)->子类构造器 。
6)即使没有显示的使用static关键字,构造器实际上也是静态方法。

Java 初始化考察
浙公网安备 33010602011771号