java中构建器的初始化顺序
2012-05-14 17:58
309 查看
初始化顺序首先是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
在对象建立的时候,对所有类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
相关文章推荐
- java对象初始化顺序
- 浅谈Java变量的初始化顺序详解
- 【java学习】java初始化顺序
- java中对象方法初始化顺序
- Java中的Package.Import.Class以及和C++的比较(二)--类成员初始化及顺序
- JAVA面试题解惑系列(一)——类的初始化顺序
- java对象初始化顺序的简单验证
- Java初始化顺序
- Java初始化顺序
- Java基础--初始化顺序
- Java基础5----初始化顺序
- java中的类的初始化顺序详解
- Java初始化顺序
- Java中的初始化顺序详解
- java中初始化顺序
- java初始化顺序
- java 静态变量与静态初始化块中变量的初始化顺序
- java初始化顺序
- java类初始化顺序
- java代码初始化顺序