java 类加载机制学习笔记

近来学习Java类加载机制,遇到一篇好的博文,记录学习下。
转载自:https://www.cnblogs.com/tengpan-cn/p/5869099.html
斗胆在原作上稍微加了一点点东西

 * 加载方法不等于执行方法,初始化变量则会赋值
 *             类加载顺序应为 加载静态方法-初始化静态变量-执行静态代码块
 *             实例化时 先加载非静态方法-实例化非静态变量-执行构造代码块-执行构造函数
 * @author panteng
 *
 */
public class StaticTest {
    /**第一个加载*/
    public static int k = 0;

    /**第二个加载,因为是new一个实例,
     * 实例化非静态变量 首先初始化j 执行36行代码 打印出  1:j i=0 n=0 t1 = null t2 = null
     * 执行构造块   打印出  2:构造块 i=1 n=1 t1 = null t2 = nulll
     * 执行构造方法 打印出  t1 i=2 n=2 t1 = null t2 = null
     * 实例化完成
     */
    public static StaticTest t1 = new StaticTest("t1");
    /**第三个加载 过程同上
     * 实例化非静态变量 首先初始化j 执行36行代码 打印出  4:j i=3 n=3 t1 = StaticTest@4554617c t2 = null
     * 执行构造块     打印出  5:构造块 i=4 n=4 t1 = StaticTest@4554617c t2 = null
     * 执行构造方法 打印出  6:t2 i=5 n=5 t1 = StaticTest@4554617c t2 = null
     */
    public static StaticTest t2 = new StaticTest("t2");

    /**第四个加载
     * 打印出  7:i i=6 n=6 t1 = StaticTest@4554617c t2 = StaticTest@74a14482
     */
    public static int i = print("i");
    /**
     * 第五个加载,简单赋值操作
     */
    public static int n = 99;

    /**
     * 此变量在类加载的时候并不初始化,在实例化类的时候初始化
     */
    public int j = print("j");

    {
        print("构造块");
    }
    /**
     * 第六个加载 此时,n已经被初始化  所以打印出
     * 8:静态块 i=7 n=99 t1 = StaticTest@4554617c t2 = StaticTest@74a14482
     */
    static{
        print("静态块");
    }
    //-----------以上属于类加载---------------------
    /**
     * 实例化过程:
     *         首先加载非静态方法集;
     *         初始化非静态变量:9:j i=8 n=100 t1 = StaticTest@4554617c t2 = StaticTest@74a14482
     *         执行构造块:10:构造块 i=9 n=101 t1 = StaticTest@4554617c t2 = StaticTest@74a14482
     *         执行构造方法:11:init i=10 n=102 t1 = StaticTest@4554617c t2 = StaticTest@74a14482
     * 实例化完成
     */

    /**
     * 执行构造函数  实例化完成
     * @param str
     */
    public StaticTest(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n + " t1 = " + t1 + " t2 = " + t2);
        ++n;
        ++i;
    }
    /**
     * 这个应该是最先加载 但是,加载不等于执行
     * 因为如果不加载此函数,静态变量是无法初始化的
     * @param str
     * @return
     */
    public static int print(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n + " t1 = " + t1 + " t2 = " + t2);
        ++i;
        return ++n;
    }

    public static void main(String[] args) {
        /**首先加载类,然后实例化:
         * 类加载过程:
         *         首先加载所有的静态方法,但不执行;
         *         然后按照静态变量的顺序开始初始化
         *         静态变量初始化完毕后执行静态构造块(不执行构造块)
         *         此时类加载完毕
         * 实例化过程:
         *         加载非静态方法
         *         初始化非静态变量
         *         执行构造代码块
         *         执行构造函数
         *         此时实例化完毕
         */
        StaticTest t = new StaticTest("init");
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,002评论 25 709
  • 找到生活中三件你最喜欢,最实用,最有质感的东西,写下来,推荐给他人,让好东西能够被更多人发现,进入到更多人的生活,...
    萌妈育儿记阅读 321评论 2 11
  • 《美国往事》看完了,四个多小时的影片,在我的倒退,推敲,暂停中,我看了五个多小时,影片采用倒序,插叙手法,使人刚看...
    冯雅fengya阅读 2,037评论 1 3
  • 不知道你们的二十岁都过成什么样子,我的二十岁,就像一盘巨大的调色盘,刚开始大片红色紫色,然后各色颜色混杂,最...
    不爱写作文阅读 149评论 0 0
  • 是什么在敲击我的心 一下一下地扣击 是里尔克的小说 《马尔特手记》 我猜他是个诗人 七十一个断片 诗一...
    草籽阅读 520评论 11 10