class中变量初始化顺序取决于变量在类中的定义顺序,所有变量一定会在任何函数执行前先初始化(包括构造函数)
static修饰的变量存放在heap中,静态变量只初始化一次,且static变量在non-static变量前初始化。println与non-static
的执行顺序按在类中的先后顺序执行。
class Bowl{
Bowl(int marker){
System.out.println("Bowl"+marker);
}
void f(int marker){
System.out.println("f"+marker);
}
}
class Table{
static Bowl b1=new Bowl(1);
Table(){
System.out.println("Table()");
b2.f(1);
}
void f2(int marker){
System.out.println("f2"+marker);
}
static Bowl b2=new Bowl(2);
}
class Cupboard{
Bowl b3 = new Bowl(3);
static Bowl b4 = new Bowl(4);
Cupboard(){
System.out.println("Cupboard()");
b4.f(2);
}
void f3(int marker){
System.out.println("f3"+marker);
}
static Bowl b5 = new Bowl(5);
}
public class StaticInitialization{
public static void main (String[] args){
System.out.println("Creating new Cupboard() in main");
new Cupboard();
System.out.println("Creating new Cupboard() in main");
new Cupboard();
t2.f2(1);
t3.f3(1);
}
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
}
程序运行结果:
Bowl1
Bowl2
Table()
f1
Bowl4
Bowl5
Bowl3
Cupboard()
f2
Creating new Cupboard() in main
Bowl3
Cupboard()
f2
Creating new Cupboard() in main
Bowl3
Cupboard()
f2
f21
f31