美文网首页
加载连接初始化

加载连接初始化

作者: shz_Minato | 来源:发表于2019-01-14 13:31 被阅读5次

 类的生命周期为加载、连接、初始化、使用和卸载。当Java程序需要某个类型的时候,需要确保这个类型已经完成了加载、连接和初始化。每个Jvm实现必须在类型首次主动使用时完成初始化
 首次:表明类型只会加载一次
 主动使用:主动使用分为以下七种情况:
  构建某个类的实例
  访问类的静态变量或者修改类的静态变量
  调用类的静态方法
  反射(Class.forName())
  初始化子类
  JVM启动时被标为启动类(包含Main方法的类)
  JDK1.7之后的动态语言支持
 综上,只有以上七种情况才会导致类的初始化,其他的被动使用情况不会导致类的初始化,但是可能会导致加载和连接。

类的加载
 类的加载是将.class文件读入内存中,将其放在运行时数据区的方法区内,然后在内存中创建一个java.lang.Class对象(存放在方法区),该对像用来封装类在方法区的数据结构,是.class文件的映射
加载class文件的方式
  本地系统加载
  网络下载的文件
  从zip、jar等归档文件中加载
  从数据库中加载
  从Java源文件动态编译出.class文件,如动态代理

类的初始化
 在此阶段,会为静态变量赋指定值,运行静态代码块。

实例

public class Main {
    public static void main(String[] args) { 
        //第一处
        System.out.println(Son.a);
    }
}

class Parent{
    public static int a=3;

    static {
        System.out.println("I am parent");
    }
}

class Son extends Parent{
    static {
        System.out.println("I am son");
    }
}

//第一处的解析
//      虽然调用了Son.a,但是对于Son来说,并不是主动使用,因此没有完成Son初始化
//      a是Parent的静态变量,实际是Parent的类信息,因此也就是Parent的主动使用。
//      方法区中开辟了一块Parent的内存,用于存放其Class信息,Son只是可以访问到这块内存,而并不是这块内存的主人

该案例的运行结果为
I am parent
3

注意点:此时并未运行Son的静态代码块,因为Son并未完成初始化。

相关文章

  • 第五课、类的加载连接与初始化过程详解

    类的加载、连接与初始化过程详解 类的加载、连接与初始化 1、过程:加载-->连接(验证-->准备-->解析) --...

  • 深入理解JVM 1 - 类加载过程

    关键字:加载、连接、初始化 在java代码中,类型(class/interface/enum)的加载、连接与初始化...

  • 类加载几个阶段

    加载 -> 连接(验证 -> 准备 -> 解析) -> 初始化 加载: 将.class文件load到内存中 连接:...

  • 类加载连接初始化阶段

    一、类的生命周期和加载阶段概述 类的生命周期 类的加载连接初始化过程 二、类的加载连接初始化详细过程  加载 使用...

  • 初识反射

    Java类的加载,连接和初始化 当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化...

  • 类加载

    一、类加载器 二、类加载过程 加载 连接 验证 准备 解析 初始化

  • JVM内存模型

    1、类的加载、连接和初始化 加载:查找并加载类的二进制数据(字节码文件) 连接: 验证:确...

  • 反射

    类加载器:加载过程 加载,连接,初始化 分类: Bootstrap ClassLoader 根类加载器:核心类的加...

  • ClassLoader

    1. 类的加载、连接、初始化 加载:查找并加载类的二进制数据 连接:-- 验证: 确保被加载类的正确性-- 准备:...

  • HiveMQ源码阅读

    插件加载及启动 同步加载异步启动 启动后校验 数据持久化加载及初始化 异步线程池加载及初始化 客户端连接流程鉴权 ...

网友评论

      本文标题:加载连接初始化

      本文链接:https://www.haomeiwen.com/subject/pmsddqtx.html