Java 初始化的我的理解

先说明一下由来吧,下面是同窗的一道笔试题,之前感受对java初始化也是了解一二的,结果,看到这题泪奔了,不会。。。上网查,本身添加println,总算是能把本身讲明吧了,不知理解的对不对,先记录下吧,也许之后再看,会发现这真是。。。幼稚java

public class StaticFunction {  
    public static int k = 0;  
    public static StaticFunction t1 = new StaticFunction("t1");  
    public static StaticFunction t2 = new StaticFunction("t2");
    public static StaticFunction t3 = new StaticFunction("t1");
    public static int i = print("i");  
    public static int n = 99;  
    public int j = print("j");
    {
        print("构造块");   
        System.out.println("t1:"+t1);
        System.out.println("t2:"+t2);
        System.out.println("j:"+j);
    }  
    static {  
        print("静态块");
        System.out.println("t1:"+t1);
        System.out.println("t3:"+t3);
        System.out.println("t1.t1:"+t1.t1);
        System.out.println("t2.t1:"+t2.t1);
        System.out.println("t3.t1:"+t3.t1);
        System.out.println("t1.t1.t1:"+t1.t1.t1);
        System.out.println("t1.t2:"+t1.t2);
        System.out.println("t1.t2.t2:"+t1.t2.t2);
        System.out.println("t2.t2.t2:"+t2.t1.t2);
        if(t1 == t3)
            System.out.println("t1 == t3");
    }  
  
    public StaticFunction(String str) {  
        System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);  
        ++i;  
        ++n;  
    }  
  
    private static int print(String str) {  
        System.out.println((++k)+":"+str+"   i="+i+"   n="+n);  
        ++n;  
        return ++i;  
    }  
  
    public static void main(String[] args) {  
        System.out.println("Start....");
        StaticFunction t=new StaticFunction("init");        
            System.out.println("Over....");
            //System.out.println("j:"+j);
    }  
  
}  

运行结果如图:jvm

上面的说结果也是符合jvm加载类的通常步骤:函数

   在Java中,类装载器把一个类装入Java虚拟机中,要通过三个步骤来完成:装载、连接和初始化,其中连接又能够分红校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工做以下:
装载:查找和导入类或接口的二进制数据;
连接:执行下面的校验、准备和解析步骤,其中解析步骤是能够选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的经常使用用途,但只能使用一次。spa

 

按照上面的,在载入一个类的时候首先要作的是给它的静态变量分配存储空间,并设默认值(int等为0 object等为null),而后在按照声明(定义)静态变量的顺序,对其进行赋值。先是k = 0,而后t1 =new StaticFunction("t1");须要注意,一个类只载入一次,其静态变量是这个类共享的。因此开始执行 public int j = print("j");又由于此时n与i还处于默认值,全部输出为0即i = 0; n = 0。接着开始执行构造块,能够看到此时t1仍是null,由于尚未执行构造函数,t1尚未初始化完毕,此时也就为null了,构造块以后即是构造函数了。还要注意的是如今仍是执行的类中静态变量的初始化,尚未轮到静态块的执行。在t1,t2,n与i初始化以后才能执行static{};t2也是一样的操做,静态变量初始化完毕以后开始执行static{}。静态(类)操做完毕以后,开始main()。。。code

相关文章
相关标签/搜索