java 中类的加载顺序

参考: http://www.cnblogs.com/guoyuqiangf8/archive/2012/10/31/2748909.html

 1、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化
 2、只有在调用new方法时才会创建类的实例
 3、类实例销毁时候,首先销毁子类部分,再销毁父类部分

package com.xiaofan.class_initialization;

public class Parent
{
    public static int i = initializationParentStaticField(); // 静态成员变量
    int j = initializationParentField(); // 类成员变量
    
    public static int initializationParentStaticField(){
        System.out.println("父类静态成员变量");
        return -1;
    }
    
    public int initializationParentField() {
        System.out.println("父类类成员变量");
        return -1;
    }

    {
        System.out.println("父类非静态代码块");
    }
    
    static
    {
        System.out.println("父类静态代码块");
    }
    
    public Parent()
    {
        System.out.println("父类的构造方法");
    }
    
    public static int parentStaticMethod()
    {
        System.out.println("父类的静态方法");
        return -1;
    }
    public int parentMethod(){
        System.out.println("父类的非静态方法");
        return -1;
    }
    
    @Override
    protected void finalize() throws Throwable
    {
        super.finalize();
        System.out.println("销毁父类");
    }
    
}
package com.xiaofan.class_initialization;

public class Child extends Parent
{
    public static int i = initializationChildStaticField(); // 静态成员变量
    int j = initializationChiledField(); // 类成员变量
    
    public static int initializationChildStaticField(){
        System.out.println("子类静态成员变量");
        return 0;
    }
    
    public int initializationChiledField() {
        System.out.println("子类类成员变量");
        return 0;
    }
    {
        System.out.println("子类非静态代码块");
    }
    static
    {
        System.out.println("子类静态代码块");
    }
    public Child()
    {
        System.out.println("子类的构造方法");
    }
   
    public static int childStaticMethod()
    {
        System.out.println("子类的静态方法");
        return 0;
    }
    public int childMethod(){
        System.out.println("子类的非静态方法");
        return 0;
    }
    @Override
    protected void finalize() throws Throwable
    {
        super.finalize();
        System.out.println("销毁子类");
    }
}
package com.xiaofan.class_initialization;

public class TestMain
{
   
    public static void main(String[] args)
    {
        Parent.parentStaticMethod();
//        Child child = new Child();
//        Child.childStaticMethod();
    }

}

输出:

Parent.parentStaticMethod();

类中static 方法在第一次调用时加载,类中static成员按在类中出现的顺序加载。

父类静态成员变量
父类静态代码块
父类的静态方法

注释掉Parent.parentStaticMethod();

去掉注释Child child = new Child();

 

父类静态成员变量
父类静态代码块
子类静态成员变量
子类静态代码块
父类类成员变量
父类非静态代码块
父类的构造方法
子类类成员变量
子类非静态代码块
子类的构造方法

注释掉Child child = new Child();

去掉注释Child.childStaticMethod();

父类静态成员变量
父类静态代码块
子类静态成员变量
子类静态代码块
子类的静态方法

总结:

一个类,只调用其static方法,加载顺序:
    1.静态成员变量
    2.静态代码块: static {}
    3.被调用的静态方法
 
子类继承父类,new子类,加载顺序:
    1.父类的静态成员变量
    2.父类的静态代码块: static {}
    3.子类的静态成员变量
    4.子类静态代码块: static {}
    5.父类类成员变量
    6.父类非静态初始化块 {}
    7.父类的构造方法
    8.子类类成员变量
    9.子类非静态代码块 {}
    10.子类的构造方法
 
调用子类的静态方法,加载顺序:
    父类静态成员变量
    父类静态代码块
    子类静态成员变量
    子类静态代码块
    子类的静态方法
posted @ 2015-02-28 19:59  vaer  阅读(312)  评论(0编辑  收藏  举报