package lifetime;
public class Trashcolleaction {
public static void main(String[] at)
{
System.out.println(Trashcolleaction.sf1+" "+Trashcolleaction.sf2);
}
static{
sf1=10;//可以用
// int a=2*sf1;
[color=red]/*之前的sf1都可以调用的,为什么此处编译出错呢?
/*既然sf1是静态的,类初始化的时候已经初始了呀,为什么不可以用呢*/[/color]
int b=sf1=20;
int c=Trashcolleaction.sf1;
}
static int sf1=sf2=30;
static int sf2;
int if1=5;
static{
int d=2*sf1;
int e=sf1=50;
}
}
我只是说声明和该静态变量的初始化是可以颠倒的,仅仅指这两个,但是对于引用则不是,因为颠倒造成的其他地方队该变量的引用的变异错误也是可能的。按照代码中顺序执行原因,你在读取sf1的时候还没有声明sf1,所以读取不了会报编译错误。你刚刚举的这个例子,已经在前面声明了sf1,自然就不会报错了。因为变量a已经认了。。记住,颠倒仅仅是该静态变量的声明和初始化,不要和其他的变量混淆。
我运行了下,没有编译出错的问题,你再看看是不是你的编译器设置的问题,或者换个环境再测试。
嗯。会报编译错误,说变量还没有定义。
静态变量的声明与初始化是两个不同的操作,静态变量的声明在编译时已经明确了内存的位置,由于静态变量的声明在编译时已经明确,所以静态变量的声明与初始化在编码顺序上可以颠倒。也就是说可以先编写初始化的代码,再编写声明代码。但是对于静态变量的引用却不可以颠倒的,所以你这里会报编译错误,提示引用了一个未被定义的变量。