Java类的加载顺序

本文简述一下java类的执行顺序

public class Test {
    
    static {
        System.out.println("静态代码块");
    }
    
    {
        System.out.println("普通代码块");
//      System.out.println(a);
    }
    
//  static int a = 5;
    
    public Test() {
        System.out.println("构造方法");
    }
    
    
    void run() {
        System.out.println("普通方法");
    }
    
    public static void main(String[] args) {
        Test test = new Test();
        test.run();
    }
}

一般来说代码都是从上到下执行的,但是这里在java当中有一点的不同,如上面的代码,执行结果:

静态代码块
普通代码块
构造方法
普通方法

就可以很清楚的看到代码的执行顺序,即使调换代码块和其他代码的顺序,结果也是一样的。另外如果把注释取消了,运行结果:

静态代码块
普通代码块
5
构造方法
普通方法

可以看到静态变量的初始化是在普通代码块之前的。

另外在看一点子类继承父类的情况

public class Father {
    static {
        System.out.println("父类静态代码块");
    }

    {
        System.out.println("父类普通代码块");
    }
    
    
    public Father() {
        System.out.println("父类构造方法");
    };
    

    public void run() {
        System.out.println("父类普通方法");
    }
    
}
public class Son extends Father{

    static {
        System.out.println("子类静态代码块");
    }
    
    {
        System.out.println("子类普通代码块");
    }
    
    
    Son(){
        System.out.println("子类构造方法");
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("子类普通方法");
    }

}

执行结果:
父类静态代码块
子类静态代码块
父类普通代码块
父类构造方法
子类普通代码块
子类构造方法
子类普通方法

综上可以看到一个类的执行顺序到底是如何了,另外可以看到父类的构造方法执行在子类的构造方法之前,是因为在子类的构造方法当中第一句话都是隐式的super();

public class Test{
    public static void main(String[] args) {
        B b = new B();
    }
}

class A{
    A(){
        System.out.println("father");
    }
}

class B extends A{
    B(){
        System.out.println("son");
    }
}

运行一下这段代码可以清楚的看到子类的构造方法先调用父类的构造方法,所谓先有老爸再有儿子嘛~

你可能感兴趣的:(Java类的加载顺序)