/*
* static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。
* 正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。
* 在static{后面跟着一段代码,
* 这是用来进行显式的静态变量初始化,这段代码不管类被实例化多少次也只会初始化一次(执行一次),且在类被第一次* 装载时,
* 1.所有静态的(无论其是变量还是块)都按顺序执行.
*2.所有的非静态的块都在静态的(无论其是变量还是块)后执行.
*3.所有的块(无论是静态的还是非静态的)都在构造之前执行.
*/
class Value{
static int c=0;
Value(){
c=15;
}
Value(int i){
c=i;
}
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
Value v=new Value(15);
static Value v1,v2;
static{
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1=new Value(27);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v2=new Value(20);
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
public static void main(String[] args){
Count ct=new Count();
prt("ct.c="+ct.v.c);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("ct.c="+ct.v.c);
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
}
结果:
v1.c=0 v2.c=0
v1.c=27 v2.c=27
v1.c=20 v2.c=20
ct.c=15
v1.c=15 v2.c=15
ct.c=16
v1.c=16 v2.c=16