Java~类加载的基本过程-附带一道经典题目讲解

  1. 加载 根据路径找到想对应的class文件 并将这个文件加载到Java虚拟机中(存储到方法区内)

类加载分为隐式类加载和显示类加载 隐式类加载是指在层程序使用new关键词创建的对象时, 会隐式的调用类的加载器把对应的类加载到JVM中. 显示类加载指的是通过直接调用class.forName() 方法把所需要的类加载到JVM中

  1. 检查: 检查类加载的class文件的正确性(文件格式检验 元数据验证 字节码验证 符号引用验证)

  2. 准备: 给类加载的静态变量分配内存空间并赋予初始默认值

  3. 解析: 虚拟机将常量池中的符号引用替换成直接引用得过程, 符号引用就可以理解为一个标识 而在直接引用就可以直接指向内存中的地址

  4. 初始化: 为静态变量和静态代码块指向初始化工作(执行静态代码块和静态变量)

什么时候会触发类加载(重点)

  1. 构造该类的实例的时候

  2. 调用该类的静态属性或方法的时候

  3. 使用子类时会触发父类的加载

经典题目

/**

  • Created with IntelliJ IDEA.

  • Description: If you don’t work hard, you will a loser.

  • User: Listen-Y.

  • Date: 2020-08-04

  • Time: 15:34

*/

class One {

public One() {

System.out.println(“One 构造”);

}

{

System.out.println(“One 实例”);

}

static {

System.out.println(“One 静态”);

}

}

class Two extends One {

public Two() {

System.out.println(“Two 构造”);

}

{

System.out.println(“Two 实例”);

}

static {

System.out.println(“Two 静态”);

}

}

public class Demo1 extends Two{

public static void main(String[] args) {

System.out.println(“开始”);

new Two();

new Two();

System.out.println(“结束”);

}

}

结果为:

One 静态

Two 静态

开始

One 实例

One 构造

Two 实例

Two 构造

One 实例

One 构造

Two 实例

Two 构造

结束

  • 分析:
  1. 代码从main方法开始执行 main方法是Demo的静态方法 就会触发Demo的类加载

  2. Two是Demo的父类 所以在加载Demo前会先加载Two 但是呢one又是Two的父类 就又会优先加载

  3. 加载One的静态代码块输出 One静态

  4. 加载Two的静态代码块 输出 Two静态

  5. Demo没有静态代码块了就会执行main方法的内容 输出 开始

  6. 在构造Two的实例的时候会先构造One的实例 就会先执行One的代码块和构造方法 然后才执行Two的代码块和构造方法 所以输出One实例 One构造 Two实例 Two构造

  7. 进行第二次构造Two的时候和第一次构造一样输出One实例 One构造 Two实例 Two构造

  8. 最后打印结束

  • 如果我们稍微改一下代码让Demo不继承Two会发生怎样的情况

/**

  • Created with IntelliJ IDEA.

  • Description: If you don’t work hard, you will a loser.

  • User: Listen-Y.

  • Date: 2020-08-04

  • Time: 15:34

*/

class One {

public One() {

System.out.println(“One 构造”);

}

{

System.out.println(“One 实例”);

}

static {

System.out.println(“One 静态”);

}

}

class Two extends One {

public Two() {

System.out.println(“Two 构造”);

}

{

System.out.println(“Two 实例”);

}

static {

System.out.println(“Two 静态”);

}

}

public class Demo1{

public static void main(String[] args) {

System.out.println(“开始”);

new Two();

new Two();

System.out.println(“结束”);

}

}

结果:

开始

One 静态

Two 静态

One 实例

One 构造

Two 实例

Two 构造

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值