类的初始化顺序

一 , :当程序执行时,当需要用到某个类时,Java执行引擎会先检查类是否已加载,若没有加载,则加载。在执行类的加载过程中,会先初始化静态成员变量和静态代码块,静态成员变量和静态代码块的执行顺序按照其代码顺序。

二,:在生成对象时,会先初始化成员变量,然后再执行构造器。其中要注意类的加载和类的生成对象是两个过程,只要用到某类,该类就一定会被加载;但不一定需要实例化生成对象。比较下面程序1和程序2:

程序1:

public class Test {
    C c = new C();
    static B b1 = new B();
    public Test () {
        
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Test t ;
    }

    
    static class B{
        public B() {
            System.out.println("B");
        }
        static {
            System.out.println("static B");
        }
        public static void printFun() {
            System.out.println("function B ");
        }
    }
    static class C{
        public C() {
            System.out.println("C");
        }
        static {
            System.out.println("static C");
        }
        public static void printFun() {
            System.out.println("function C ");
        }
    }
}

执行结果为:

static B
B

程序二:

public class Test {
    C c = new C();
    static B b1 = new B();
    public Test () {
        
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Test t = new Test ();
        
        
    }

    
    static class B{
        public B() {
            System.out.println("B");
        }
        static {
            System.out.println("static B");
        }
        public static void printFun() {
            System.out.println("function B ");
        }
    }
    static class C{
        public C() {
            System.out.println("C");
        }
        static {
            System.out.println("static C");
        }
        public static void printFun() {
            System.out.println("function C ");
        }
    }
}

执行结果为:

static B
B
static C
C

原文地址:https://www.cnblogs.com/a-old-foolish/p/11079429.html