关闭

Java的初始化顺序

111人阅读 评论(0) 收藏 举报
分类:

当一个类被加载时,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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:62056次
    • 积分:2150
    • 等级:
    • 排名:第18705名
    • 原创:148篇
    • 转载:57篇
    • 译文:3篇
    • 评论:6条