子类与父类的初始化


最近读了深入理解Java虚拟机这本书,在学习类加载机制的时候,突然反应过来,一些笔试题经常考的,子类继承了父类且子类和父类的构造器中均有打印输出,让作答输出了哪些内容,其实考的知识点就是类加载的时机。

被动引用的例子之三

package com.depthmind.classloader;

/**
 * 常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,
 * 因此不会触发定义常量的类的初始化
 */
public class ConstClass {
    static {
        System.out.println("ConstClass init");
    }
    public static final String HelloWord = "hello word";
}
package com.depthmind.classloader.test;

import com.depthmind.classloader.ConstClass;
import org.junit.Test;

public class TestConstClass {
    @Test
    public void notInitialization() {
        System.out.println(ConstClass.HelloWord);
    }
}

作者原话,上述代码运行之后没有输出“ConstClass init!“,是因为虽然在Java源码中引用了ConstaClass类中的常量HelloWord,但其实在编译阶段通过常量传播优化,已经将此常量值的“hello word“存储到了TestConstClass类的常量池中,以后TestConstClass对常量ConstClass.HelloWord的引用实际都被转化为了TestConstClass对自身常量池的引用了。也就是说实际上TestConstClass的class文件之中并没有ConstClass类的符号引用入口类,这两个类在编译成class文件之后就不存在任何联系了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值