请教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;了
综上所述,我想应该可以解释楼主的问题了
不过我个人不善表达,可能描述得不太清楚