define_us的专栏

JAVA深入,python浅出

Java的初始化顺序

当一个类被加载,class.forname或者使用静态方法时,总是先初始化父类的static部分,再初始化子类的static部分,非静态成员一律不初始化。任何一个类的静态部分只被初始化一次

public class Test{          
    public static void main(String[] args) {
        System.out.println("MAIN");
        Test0.Fun1();
    }   
}



class Test0 extends Test1{  
    static{
        System.out.println("Static area in TEST0");
    };  
    Test3 t3;                   
    public static void Fun1(){
    }   
}
class Test1{
    static{
        System.out.println("Static area in father class");
    };
    Test1(){
        System.out.println("constructor in father class");
    }
}

上述代码输出
MAIN
Static area in father class
Static area in TEST0

当一个类被实例化时,如果类还没有被加载,则先加载,再实例化。实例化中先运行父类的构造函数,再运行子类的构造函数。如果类中的成员没有被初始化,其值为null,其相当于还没有被加载。

public class Test{          
    public static void main(String[] args) {
        System.out.println("MAIN");
        Test0 t0 = new Test0();
        System.out.println(t0.t3);
    }   
}



class Test0 extends Test1{


    static{
        System.out.println("Static area in TEST0");
    };

    Test3 t3;       

    public static void Fun1(){

    }
    Test0(){
        System.out.println("constructor in TEST0");
    }



}
class Test1{
    static{
        System.out.println("Static area in father class");
    };
    Test1(){
        System.out.println("constructor in father class");
    }
}

class Test3{
    static{
        System.out.println("Static area in member class");
    };
    Test3(){
        System.out.println("constructor in menber class");
    }
}

上面程序输出为
MAIN
Static area in father class
Static area in TEST0
constructor in father class
constructor in TEST0
null

java最开始处理main函数时,相当于如上静态加载main类。Java会线执行Main类父类的静态块,然后是Main类的静态块。

阅读更多
个人分类: java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Java的初始化顺序

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭