jvm 静态类及非静态类的变量,方法加载顺序

  2 class data{
  3         private static final data mInstance = new data();
  4         private static int mx = 0;
  5         private data()
  6         {
  7                 System.out.println("mx=" + mx);
  8                 mx = getVersion();
  9         }
 10         public static data getInstance()
 11         {
 12                 return mInstance;
 13         }
 14         public int getVersion()
 15         {
 16                 int v = 0;
 17                 if (v == 0)
 18                 {
 19                         v = 7;
 20                 }
 21                 return v;
 22         }
 23         public int getmx()
 24         {
 25                 return mx;
 26         }
 27 }
 28
 29 class Test
 30 {
 31         public static void getData(StringBuffer sb)
 32         {
 33                 sb.append("hello world ");
 34         }
 35         public static void main(String args[])
 36         {
 37                   System.out.println(data.getInstance().getmx());
 38         }
 39 }                                                                                                                                                                                                                                                                                                                                                                                                                                                                             打印结果:
   mx=0

   0

其实这个问题很简单,牵扯到类加载顺序以及类中代码执行的顺序问题。
类的初始化顺序如下:
父类静态变量
父类静态块
子类静态变量
子类静态块
父类变量
父类普通块
父类构造函数(子类实例化时先要调用父类构造函数)
子类变量
子类普通块
子类构造函数

如果有多个初始化块,则按照代码先后顺序执行。
因此此问题解释如下:
1.date中的静态变量data会在类加载的时候首先初始化,因此初始化的时候调用date构造函数,将会将m赋值为7,
2.然后执行private static int mx = 0进行初始化m操作,因此此时m又成了0.
楼主可以将private static int mx = 0这句放在private static final data mInstance = new data();前面执行,结果就会不一样了。

可以在private static final data mInstance = new data();
后面加上
static{
System.out.println("static");
}
然后执行看看初始化的先后顺序如何

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值