静态成员变量在静态代码块中初始化和定义时初始化,调用结果不同

u011165933 2017-02-16 09:34:30
深入理解java虚拟机看到类加载部分的<clinit>()方法,书中的例子不太理解,为什么打印的结果是2不是1?
class Parent {
public static int A = 1; //如果该语句和下面的静态代码块顺序交换,则打印的结果为1,这是为什么?
static {
A = 2;
}

}

class Sub extends Parent {
public static int B = A;

}

public class Test0 {
public static void main(String[] args) {
System.out.println(Sub.B);
}
}

简化了一下,应该和上面是一个意思,去掉子类,代码如下,为什么Parent中两个语句交换顺序后结果会不一样?
class Parent {
public static int A = 1; //同上,与static代码块顺序交换后打印结果改变
static {
A = 2;
}

}
public class Test0 {
public static void main(String[] args) {
System.out.println(Parent.A);
}
}
...全文
499 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-02-18
  • 打赏
  • 举报
回复
这个东西有加载顺序,你验证得出什么结论就是什么顺序,这是语言的特点
墨笙弘一 2017-02-17
  • 打赏
  • 举报
回复
引用 2 楼 u011165933 的回复:
[quote=引用 1 楼 u012934325 的回复:] 同一个静态常量 覆盖掉了吧
我不太理解的是,如果执行打印Sub.B语句,那么应该首先执行Parent中的静态代码块,得到A=2,但是static代码块外对A有赋值操作,此时为什么不执行public static int A = 1这个赋值操作?[/quote] 楼下告诉你了 你可以将你那些疑问 全部写在一个类里面,用不同常量表示,执行以下就知道加载的顺序了
u011165933 2017-02-17
  • 打赏
  • 举报
回复
引用 3 楼 lshz008 的回复:
一般加载顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法  静态块和静态变量是并列的,先后写影响到加载顺序。所以后面覆盖前面。没有问题
谢谢,你讲的很明白,还想问下,如果还有构造代码块,那么这几个加载顺序是不是: 静态块(静态变量)——>成员变量——>构造代码块——>构造方法——>静态方法 
jero丶泽 2017-02-16
  • 打赏
  • 举报
回复
补充一下,静态的东西都是在类加到环境虚拟机时初始化的
jero丶泽 2017-02-16
  • 打赏
  • 举报
回复
一般加载顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法  静态块和静态变量是并列的,先后写影响到加载顺序。所以后面覆盖前面。没有问题
u011165933 2017-02-16
  • 打赏
  • 举报
回复
引用 1 楼 u012934325 的回复:
同一个静态常量 覆盖掉了吧
我不太理解的是,如果执行打印Sub.B语句,那么应该首先执行Parent中的静态代码块,得到A=2,但是static代码块外对A有赋值操作,此时为什么不执行public static int A = 1这个赋值操作?
墨笙弘一 2017-02-16
  • 打赏
  • 举报
回复
同一个静态常量 覆盖掉了吧

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧