jvm的加载顺序:
父类static块,子类static块,父类构造函数,子类构造函数
1. public class MyObject {
2.
3. public void getX(){
4. System.out.print("x =" + x);
5. }
6.
7. static {
8. System.out.println(x);
9. }
10.
11. static int x = 10;
12.
13. public static void main(String [] args){
14. MyObject myObject = new MyObject();
15. myObject.getX();
16. }
17.
18. }
public class MyObject {
public void getX(){
System.out.print("x =" + x);
}
static {
System.out.println(x);
}
static int x = 10;
public static void main(String [] args){
MyObject myObject = new MyObject();
myObject.getX();
}
}
如果是初始化为0.
那么为何此时编译不过。
出错位置:System.out.println(x);
这个在JLS(第3版)里面有说到
12章里面谈到,大意是
静态字段是在加载类时初始化为默认值,不需要调用代码
而显式初始化是作为初始化类的一部分执行的,并且必须按顺序调用静态初始化语句,并且"不能引用其声明出现在使用之后的类中声明的变量"(原话),也就是说,你只要不把它取出来就可以