类的初始化过程

类的初始化过程

类的加载步骤

package com.han.reflection;

/*
 * 执行结果如下:
 * A类静态代码块初始化!
 * A类的无参构造器执行了!
 * 20
 */
public class Test04 {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(A.m);
    }
    /*
     * 类的加载过程
     * 1.加载到内存,会产生一个Class对象
     * 2.链接结束后,m = 20
     * 3.初始化
     * <clinit>(){
     *     System.out.println("A类静态代码块初始化!");
     *     m = 10;
     *     m = 20;
     * }
     */
}

class A{
    static {
        System.out.println("A类静态代码块初始化!");
        m = 10;
    }

    static int m = 20;

    public A(){
        System.out.println("A类的无参构造器执行了!");
    }
}

下面再举个例子看下类的加载过程

package com.han.reflection;

public class Test05 {
    static {
        System.out.println("Main类被加载");
    }

    public static void main(String[] args) throws ClassNotFoundException {
        /* 1.主动new对象
         * 运行结果如下:
         *
         * Main类被加载
         * 父类被加载
         * 子类被加载
         */
        //Son son = new Son();

        /* 2.通过反射创建对象
         * 运行结果如下:
         *
         * Main类被加载
         * 父类被加载
         * 子类被加载
         */
        //Class.forName("com.han.reflection.Son");

        /** 3.通过子类调用父类的变量,会发现子类没有被加载
         *  运行结果如下:
         *
         *  Main类被加载
         * 父类被加载
         * 1
         */
        //System.out.println(Son.b);

        /* 4.创建数组,会发现自会加载Main类
         * 运行结果如下:
         *
         * Main类被加载
         */
        //Son [] array = new Son[5];

        /* 5.调用子类对的常量
         * Main类被加载
         * 10
         */
        System.out.println(Son.M);
    }
}

/*
 父类
 */
class Father{
    static int b = 1;
    static {
        System.out.println("父类被加载");
    }
}

/*
 子类
 */
class Son extends Father{
    static {
        System.out.println("子类被加载");
    }
    static int a = 2;
    static final int M = 10;
}
posted @ 2021-12-20 17:48  Dawn_006  阅读(74)  评论(0)    收藏  举报