static块的疑问

来源:百度知道 编辑:UC知道 时间:2024/09/22 13:27:29
public class Test{
static{
i = 30;
//System.out.println(i);
}
static int i = 10;
public static void main(String[]args){
}
}
如果把注释的部分恢复,则会报错:非法向前引用,但是如果注销的话,则不会报错,这样的话static块和static语句的执行先后顺序到底是什么?

是这样的,像你这样的语句,如果注销的话i是初始化了两次。第一次为静态代码块部分的初始化,第二次是在static int i = 10;
这样的代码在java中是可行的。

但你不能在static代码块 中打印i,因为java中具有相同级别的代码总是从前向后执行的。在你打印i的时候i还没有声明呢,所以会出现非法向前引用。

放到前面的话肯定不会出错的,上面已经说的很清楚了。至于为什么注释的话还能成功,而且是我上面说的那个初始化顺序我就不大了解了。以前在看java编程思想的时候曾经遇到过这样的问题,不过上面也没有说明白,只是说内部类什么的,必须引进这么一个机制。

告诉你一个趣事,如果将static语句放在静态块前面,去掉注释就不会出错。
而放在后面就会出错,你觉得顺序是怎样的呢?

报错是因为你定义i的时候没有指定类型,jvm不承认i,所以当你System.out.println(i)的,jvm找不到i了,这些是会在编译时检查的。

顺序:static的块和static的变量,都是
先于成员变量由从上至下,从左至右初始化的。

System.out.println(i)放在i定义的前面,肯定报错了。。