详解Java中类的加载与其初始化

详解Java中类的加载与其初始化

Java虚拟机在运行Java程序的时候,会先将程序中所有需要用到的类加载进内存。而类的加载并不仅仅指从磁盘读取class文件并转化为二进制码,还包括链接、初始化等操作。本文会对Java中类的加载、连接、初始化过程进行详细阐述,并通过两条示例进行说明。

类的加载

类的加载通常在Java程序运行过程中进行,加载的方式有以下几种:

  1. 从本地系统中直接加载已经存在的class文件。
  2. 通过网络下载class文件,例如在Java Applet中。
  3. 从zip或jar等归档文件中加载class文件。
  4. 通过专门的类加载器动态生成类字节码,例如JSP页面中的脚本。

Java的类加载器采用的是一种双亲委派的机制。即在类的加载过程中,会先将请求交给父加载器进行处理,如果父加载器无法处理,才由自己来处理。父加载器和子加载器之间是一种包含与继承的关系,子加载器所加载的类可以访问父加载器所加载的类,反之则不行。

类的连接

类的连接可以分为以下三步:

  1. 验证:确保被加载的类的正确性。
  2. 准备:为类的静态变量分配内存,并将其初始化为默认值。
  3. 解析:把类中的符号引用转换为直接引用。

其中验证和解析两步暂不展开说明,准备阶段是为类的静态变量分配内存,并将其初始化为默认值,如int类型的默认值为0,对象类型的默认值为null。注意,除了被声明为final的static变量外,这里所指的“初始化”并不是指类中定义的初始化方法(例如构造方法或静态块)。

类的初始化

只有当对类进行第一次主动使用时,才会触发类的初始化。主动使用包括以下几种情况:

  1. 创建类的实例对象。
  2. 调用类的静态方法或静态变量。
  3. 使用反射方式来创建某个类的对象。
  4. 使用反射方式来调用某个类的静态方法或静态变量。
  5. 初始化某个类的子类。
  6. Java虚拟机启动时被标明的启动类。

类初始化的过程包括以下步骤:

  1. 首先执行所有声明为final的static常量的赋值语句(如果这些常量还未被赋值)。
  2. 执行static块。
  3. 对于非final的static变量,执行赋值语句(如果这些变量还未被赋值)。

在类初始化的过程中,如果某个已被加载的类在其父加载器或其它类加载器中已经被初始化,则不会再次触发初始化。如果一个类在初始化过程中产生了异常,则该类会初始化失败。

示例

下面通过两条示例说明类的加载、连接与初始化过程。

示例一

public class Example {
    static {
        System.out.println("Example's static block");
    }
}

在运行主程序时,虚拟机首先会尝试加载Example类,因为Example类还未被加载过,所以进行了如下过程:

  1. 加载Example类。
  2. 准备Example类的静态变量,此时Example类尚未初始化,且没有父类,所以在准备阶段,jvm会为Example类的静态变量分配内存,并将其初始化为默认值。
  3. 开始初始化Example类,先执行所有声明为final的static常量的赋值语句(如果这些常量还未被赋值),但Example类中并不存在这样的常量。
  4. 执行静态块,输出“Example's static block”。

示例二

public class Example2 {
    public static void main(String[] args) {
        System.out.println("Example2.main");
    }
}

在运行主程序时,虚拟机首先会尝试加载Example2类,因为Example2类还未被加载过,所以进行了如下过程:

  1. 加载Example2类。
  2. 准备Example2类的静态变量,此时Example2类尚未初始化,且没有父类,所以在准备阶段,jvm会为Example2类的静态变量分配内存,并将其初始化为默认值。
  3. 开始初始化Example2类,先执行所有声明为final的static常量的赋值语句(如果这些常量还未被赋值),但Example2类中并不存在这样的常量。
  4. 执行main方法所在的类Example2的静态方法print,输出“Example2.main”。

总结

类的加载、连接、初始化是Java虚拟机运行Java程序的重要流程。类的加载是指在程序运行的过程中,将需要用到的类加载进内存,Java的类加载器采用的是一种双亲委派的机制。类的连接包括验证、准备和解析三个操作。类的初始化只有在主动使用时才会触发,其中被声明为final的static变量除外。在类初始化的过程中,如果某个类已被加载并初始化,则不会再次触发初始化。这里通过两个简单的示例进行了说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java中类的加载与其初始化 - Python技术站

(0)
上一篇 2023年6月20日
下一篇 2023年6月20日

相关文章

  • 【python标准库模块一】时间模块time学习

    【Python标准库模块一】时间模块time学习的完整攻略 时间模块time是Python标准库中的一个重要模块,它提供了一些函数,用于处理时间和日期。本文将为您提供一份详细的时间模块time学习的完整攻略,包括时间模块time的基本概念、使用方法和两个示例说明。 时间模块time的基本概念 时间模块time是Python标准库中的一个模块,它提供了一些函数…

    other 2023年5月5日
    00
  • mhdd使用方法图解 使用MHDD修护硬盘坏道教程

    MHDD使用方法图解 使用MHDD修护硬盘坏道教程 什么是MHDD MHDD是一款硬盘工具软件,可以用于检测以及修复硬盘的坏道。同时,MHDD还支持多种品牌的硬盘,比如西部数据、希捷、日立、东芝等等。 下载与安装MHDD 首先,需要从官方网站(https://hddguru.com/software/2005.10.02-MHDD/mhdd_manual.e…

    other 2023年6月27日
    00
  • [Nginx]Nginx的一些概念

    [Nginx] Nginx的一些概念 什么是Nginx? Nginx是一款高性能的Web服务器,也可以用作反向代理服务器、负载均衡器、HTTP缓存、HTTP媒体流服务器等。其设计目的是为了解决C10K问题,即支持高并发连接,又能够保证高性能。 Nginx的主要特点 高并发支持 Nginx的事件驱动模型非常适合处理高并发连接,它可以在相对较少的资源下处理大量的…

    其他 2023年3月28日
    00
  • AD常用命令以及概念

    AD常用命令以及概念 AD(Active Directory)是微软推出的一种基于LDAP(Lightweight Directory Access Protocol)协议的目录服务,用于管理网络系统的用户、计算机、群组、权限等信息。在日常的系统管理工作中,掌握AD的基本知识和常用命令是非常有必要的。 概念介绍 域(Domain) AD中的域指的是逻辑上的一…

    其他 2023年3月28日
    00
  • Vivado中debug用法

    Vivado是一款由Xilinx公司开发的FPGA设计工具,提供了丰富的调试功能,可以帮助开发人员快速定位和解决设计中的问题。以下是“Vivado中debug用法”的完整攻略: Vivado中的调试功能 Vivado中的调试功能包括以下几个方面: 时序分析:可以对设计中的时序进行分析,查找时序问题。 逻辑分析:可以对设计中的逻辑进行分析,查找逻辑问题。 信号…

    other 2023年5月5日
    00
  • Unix文件系统和pwd命令实现详解

    Unix 文件系统和 pwd 命令实现详解 Unix 文件系统是一个树形结构的文件系统,是现代操作系统中应用广泛的文件系统之一。Unix 文件系统定义了文件的操作以及它们在系统中的位置。 Unix 文件系统的结构 Unix 文件系统中的每个文件和目录都有一个唯一的路径。路径的第一个部分是根目录 /。根目录下可以包含多个子目录。每个子目录可以包含文件、子目录和…

    other 2023年6月26日
    00
  • 代理服务器CCProxy安装与图文设置方法

    下面是“代理服务器CCProxy安装与图文设置方法”的详细攻略。 安装 首先,你需要下载CCProxy的安装文件,可以从官网(http://www.youngzsoft.net/ccproxy/)下载。下载完成后,双击安装文件,按照提示进行安装,安装完成后,启动CCProxy。 配置 CCProxy 配置代理服务器 打开CCProxy,单击“选项”按钮,选择…

    other 2023年6月27日
    00
  • 详解Flutter Widget

    详解Flutter Widget Flutter是一个跨平台的移动应用开发框架,其使用Dart语言进行开发,在Flutter中,一切都是Widget。Widget是Flutter中所有用户界面块的基本单元。 应用程序UI是使用嵌套Widget构建起来的,而这些Widget可以是布局元素,例如Container或Row,也可以是几乎所有的可视元素,如按钮、文本…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部