解析Java虚拟机中类的初始化及加载器的父委托机制

解析Java虚拟机中类的初始化及加载器的父委托机制

1. 类的加载过程

  • 类的加载过程包含:加载、连接和初始化三个步骤。
  • 加载过程:通过获取字节流,将.class文件放入内存,并产生一个代表该类的Class对象。
  • 连接过程:分为验证、准备、解析三个阶段,其中解析阶段可能会涉及到类或接口的初始化。
  • 初始化过程:为类的静态变量赋予正确的初始值,进行类构造器()方法的调用。

2. 类的初始化

  • 当Java程序对某个类进行初始化时,如下操作可能会触发类的初始化:
  • 当程序创建某个类的新实例时、
  • 当访问该类的静态变量时、
  • 当调用该类的静态方法时、
  • 当Java虚拟机启动某个类时(如程序的入口方法main())。

  • 类初始化的步骤如下:

  • 确认类已经被加载、连接后;
  • 执行类的()方法——类的构造器方法,为类的静态变量赋值并执行静态块。

3. 加载器的父委托机制

  • 加载器的父委托机制是ClassLoader的读代码时常说的重要特性之一。
  • 当我们需要加载某个类时,先从最近的加载器开始,依次向上委托它的父加载器进行加载。
  • 如果父加载器未能找到该类,那么将会由其子加载器来进行加载。

4. 详细示例

  • 示例1

```
class Person{
static final String WELCOME= "welcome";
static { System.out.println("Initialize for Person"); }
}

class InitDemo{
public static void main(String[] args){
System.out.println(Person.WELCOME);//使用类的静态变量
}
}
```
解析:

当外部程序访问Person.WELCOME变量时,如果类还未初始化,那么此时会先初始化Person类。在Person类初始化过程中,静态块中的代码先被执行,最终输出"Initialize for Person"。当Person类初始化完成后,再输出"WELCOME"。

  • 示例2

```
class A{
static {System.out.println("Initialize for A");}
public static void f1(){}
}

class B{
static {System.out.println("Initialize for B");}
}

public class C{
static {
System.out.println("Initialize for C");
}
public static void main(String[] args){
A.f1();
}
}
```
解析:

当程序运行时,需要加载并执行main()方法,而main()方法中会调用class A的静态方法f1()。根据初始化的条件,程序会先初始化class A,调用静态块输出"Initialize for A"。在A类初始化完成之后,才会进入C类的主方法中,调用静态方法f1()。类B则因为无法访问,未进行初始化。因此输出结果为"Initialize for A"。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析Java虚拟机中类的初始化及加载器的父委托机制 - Python技术站

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

相关文章

  • IIS 7.5 HTTP 错误 404.3 – Not Found错误的解决方法

    IIS 7.5 HTTP 错误 404.3 – Not Found 错误的解决方法 当在使用IIS 7.5作为Web服务器时,您可能会遇到HTTP错误404.3 – Not Found错误。这个错误通常表示IIS无法为请求提供所需的MIME类型的映射。以下是解决这个问题的完整攻略: 步骤1:检查IIS配置 首先,您需要检查IIS的配置,确保它已正确设置以处理…

    other 2023年8月5日
    00
  • iOS12.0.1正式版更新内容 iOS12.0.1正式版升级方法和固件下载

    以下是关于“iOS 12.0.1 正式版的升级方法和固件下载”的完整攻略,包含了两个示例说明。 升级方法 要升级到 iOS 12.0.1 正式版,可以按照以下步骤进行: 确保你的设备已连接到互联网。 打开设备的设置应用程序。 滚动并点击“通用”。 点击“软件更新”。 如果有可用的更新,点击“下载并安装”。 等待下载完成后,点击“安装”。 设备将自动重启并完成…

    other 2023年8月2日
    00
  • dedecms新增字段调用实例方法

    接下来我将为你讲解一下“dedecms新增字段调用实例方法”的完整攻略。 一、什么是dedecms新增字段调用实例方法 dedecms是一款开源的CMS,许多网站都是使用dedecms搭建的。在进行网站开发时,我们可能需要添加一些额外的数据字段来扩展网站的功能。那么,如何调用新增字段呢?这就需要使用到dedecms新增字段调用实例方法的知识了。 二、dede…

    other 2023年6月25日
    00
  • 访问编码后的中文URL返回404错误的解决方法

    当我们访问编码后的中文URL时,有时会遇到404错误的情况,这是由于服务器未对编码后的URL进行解码导致的。解决这种问题的方法是对URL进行解码,使其转换回中文字符。 下面是解决“访问编码后的中文URL返回404错误的解决方法”的完整攻略: 步骤一:确认是否是URL编码问题 访问编码后的URL时,如果出现404错误,可以先确认是否是URL编码的问题。可以通过…

    other 2023年6月26日
    00
  • 一篇文章带你了解java接口与继承

    一篇文章带你了解Java接口与继承 前言 Java面向对象编程(OOP)中的两个重要概念:接口(Interface)和继承(Inheritance)。接口和继承共同点是都可以扩展代码的复用性,降低代码耦合性;不同点是接口是定义方法的集合,而继承是用于实现类之间的继承关系。 Java接口 什么是接口? 接口是一种抽象类型,它定义了类必须遵循的一组规则。接口以i…

    other 2023年6月27日
    00
  • SQL中CAST()实例之转换数据类型

    下面是SQL中CAST()实例之转换数据类型的详细攻略: 标题 什么是CAST()函数 CAST()函数是SQL Server中用来转换数据类型的一个函数,它能将一个数据类型的值转换成另一个指定的数据类型。 CAST()函数的语法 CAST(expression AS data_type) 其中,expression是需要被转换的表达式或列名,data_ty…

    other 2023年6月26日
    00
  • CentOS下重启Mysql的各种方法(推荐)

    CentOS下重启Mysql的各种方法(推荐) 在CentOS中,经常需要重启Mysql服务,本攻略将针对这种情况给出以下重启Mysql的各种方式和方法。 方法一:使用service命令重启Mysql服务 service mysqld restart 该命令将会重启Mysql服务,该方法适用于CentOS 6及之前的版本,但CentOS 7不再推荐使用ser…

    other 2023年6月27日
    00
  • Android PullToRefreshLayout下拉刷新控件的终结者

    Android PullToRefreshLayout下拉刷新控件的终结者攻略 简介 PullToRefreshLayout是Android上常用的下拉刷新控件,常见于各类App中,让用户可以快速地更新数据。但是,常规的PullToRefreshLayout存在着各种各样的问题,例如下拉刷新不流畅、刷新动画不美观等等,这些问题都会影响用户的使用体验。因此,在…

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