首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

请问static代码块初始顺序的有关问题

2012-01-14 
请教static代码块初始顺序的问题。代码1:Java代码 复制代码1. public class MyObject {2.3.public void get

请教static代码块初始顺序的问题。
代码1:
Java代码 复制代码

  1. public class MyObject {  
  2.  
  3. public void getX(){  
  4. System.out.print("x =" + x);  
  5. }  
  6.  
  7. static int x = 10;  
  8.  
  9. static {  
  10. x = 20;  
  11. }  
  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 int x = 10;

static {
x = 20;
}

public static void main(String [] args){
MyObject myObject = new MyObject();
myObject.getX();
}

}



此时打印结果是:
x = 20
貌似static块是按照顺序从上往下执行的。

但是

代码2
Java代码 复制代码

  1. public class MyObject {  
  2.  
  3. public void getX(){  
  4. System.out.print("x =" + x);  
  5. }  
  6.  
  7. static {  
  8. x = 20;  
  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 {
x = 20;
}

static int x = 10;

public static void main(String [] args){
MyObject myObject = new MyObject();
myObject.getX();
}

}




编译通过,此时打印结果是:
x = 10
难道是说 x 先被初始化为0?

接着

代码3:
Java代码 复制代码

  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);

[解决办法]

LZ别生气了,大家都挺热情的啊
1、都是静态的话,顺序从上而下.
2.初始化为0.
public class MyObject {

public void getX(){
System.out.print("x =" + x);
}
static int x; //你没有定义哦,既然没定义,是不会初始为0的;类方法怎样我不清楚,但是static块确实是在main()方法
//之前执行的.
static {


System.out.println(x);
}
//static int x = 10;


public static void main(String [] args){
MyObject myObject = new MyObject();
myObject.getX();
}

}

[解决办法]
礼下于人,必有所求。

如果想得到别人的帮助,就要谦虚点。

被人数落,戏弄,甚至嘲笑都是正常的。以后你会遇到更多这样的人。 有志气就不要问别人,自己搞定。 

这不是贬义,而是告诉你要摆正心态。只要我们目标明确:拿到答案,才不管别人怎么说。
学到了才是自己的。学不到只能愿自己。
其它的,一笑而过又如何。


希望楼主明白我的苦心。


你可以向我拍砖,我接着,但只会滑过而已。。 呵呵!!
[解决办法]

我只是希望帮助提问的人自己找答案而已,而不是摊开手要答案,我并不在乎分数
你要这么想我也没办法
其实这个在JLS(第3版)里面有说到

12章里面谈到,大意是
静态字段是在加载类时初始化为默认值,不需要调用代码
而显式初始化是作为初始化类的一部分执行的,并且必须按顺序调用静态初始化语句,并且"不能引用其声明出现在使用之后的类中声明的变量"(原话),也就是说,你只要不把它取出来就可以

针对你的代码2分析:

x=30;
代码是:
bipush 30
putstatic
没有涉及取值操作getstatic,所以允许执行

改动一下为
x++;
代码变为:
getstatic
iconst_1
iadd
putstatic
这时涉及了取值操作getstatic
则抛出"非法向前引用"错误


再改动一下,将
static int x = 10;
 放入静态域,变为
static {int x = 10;}
这时的x是在局部定义的,不算类静态变量,存取方式也不同,所以会再抛出错误
反编译之后也可以见到其的确不再是类静态变量了
因此静态域跟静态字段也是不同的,不要想当然地以为static {int x = 10;}就等于static int x = 10;了



综上所述,我想应该可以解释楼主的问题了
不过我个人不善表达,可能描述得不太清楚

热点排行