java中构建器的初始化顺序

来源:互联网 发布:英雄联盟 mac版 编辑:程序博客网 时间:2024/06/07 18:05

初始化顺序首先是static(第一次初始化),其次是非static对象。

在对象建立的时候,对所有类static变量从上往下一次初始化,只发生一次。

其次是构建器初始化。

在new 对象()的时候,类中的所有变量都会被初始化

例子

class Cup {
Cup(int marker) {
System.out.println("Cup(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}


class Cups {
static Cup c1;
static Cup c2;
static {
c1 = new Cup(1);
c2 = new Cup(2);
}
Cups() {
System.out.println("Cups()");

}
}


public class ExplicitStatic {
public static void main(String[] args) {
System.out.println("Inside main()");
Cups.c1.f(99); // (1)
}
static Cups x = new Cups(); // (2)
static Cups y = new Cups(); // (2)

//Cups c = new Cups();(3)
} ///:~


输出

Cup(1)
Cup(2)
Cups()
Cups()
Inside main()
f(99)


若去掉(3的注释),也不会调用Cups c =new Cups();因为不是静态变量,也没有调用ExplicitStatic();

如果有extends

装载的时候会先去找父类,并载入,如果父类还有父类,会继续向上寻找父类,然后有上向下一个个载入,先static变量,再非static变量

所有必要类装载完毕后,会初始化所有成员变量,由父类开始先初始化成员变量,再构造器,再子类成员变量,构造器。

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;
}
}

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.x initialized
static Beetle.x initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 63
j = 39