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

来源:互联网 发布:sql server 分组排序 编辑:程序博客网 时间:2024/06/04 19:35
  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
原创粉丝点击