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

yizhihongxing

解析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日

相关文章

  • FreeRTOS任务控制API函数的功能分析

    下面我会对”FreeRTOS任务控制API函数的功能分析”进行详细讲解,包含以下内容: FreeRTOS任务控制API函数介绍 FreeRTOS任务控制API函数功能分析 两个示例说明 1. FreeRTOS任务控制API函数介绍 FreeRTOS是一个流行的开源实时操作系统(RTOS),它提供了各种任务控制API函数,用于创建,删除,暂停,恢复等任务控制操…

    other 2023年6月27日
    00
  • linux下普通文件和目录文件区别详解

    Linux下普通文件和目录文件区别详解 在 Linux 操作系统中,普通文件和目录文件是两种最基本最常用的文件类型。本文将详细讲解在 Linux 系统中普通文件和目录文件的区别。 1. 普通文件 普通文件是指不包含任何特殊属性的文件,可以存储文本、二进制数据等各种格式的文件。普通文件有很多种类型,比如文本文件、二进制文件、图片文件、压缩文件等,我们可以使用 …

    other 2023年6月26日
    00
  • Eclipse导入SVN项目的三种方式

    Eclipse导入SVN项目的三种方式 如果你需要在Eclipse中管理和修改SVN项目,导入SVN项目是非常必要的。在本文中,我们将介绍Eclipse导入SVN项目的三种方式。 1. 使用Eclipse自带的SVN插件 第一种方式是使用Eclipse自带的SVN插件,该插件允许你直接从SVN服务器导入项目。下面是具体步骤: 在Eclipse中打开“SVN …

    其他 2023年3月28日
    00
  • TortoiseSVN怎么改文件名?TortoiseSVN更改文件名教程

    TortoiseSVN怎么改文件名? 在TortoiseSVN中,改变文件名是一个很常见的操作。该软件提供了一种简单快捷的方式,可以实现在SVN版本控制下更改文件名。 步骤: 打开TortoiseSVN。 在Windows文件资源管理器中找到要更名的文件或文件夹,右键单击它并选择“TortoiseSVN”菜单,然后选择“重命名”。 输入新的文件名或文件夹名称…

    other 2023年6月26日
    00
  • Android 退出应用程序的实现方法

    以下是详细讲解“Android 退出应用程序的实现方法”的完整攻略。 1. 使用系统默认方式退出应用程序 Android平台提供了一个系统默认的退出应用程序的方式,即在Activity中调用finish()方法。当我们调用finish()方法时,当前Activity将被销毁并从栈中移除。最后,如果这是栈中的唯一一个Activity,则整个应用程序也将被销毁。…

    other 2023年6月25日
    00
  • Android自动文本框输入识别提示功能代码

    Android自动文本框输入识别提示功能代码攻略 在Android应用中实现自动文本框输入识别提示功能,可以提供更好的用户体验和输入效率。下面是一个完整的攻略,包含了实现该功能的代码示例。 步骤一:添加依赖库 首先,在项目的build.gradle文件中添加以下依赖库: implementation ‘com.google.android.material:…

    other 2023年9月6日
    00
  • ftp使用

    FTP使用 FTP,即File Transfer Protocol,是指一种用于文件传输的协议,是互联网上使用最广泛、应用最为广泛的文件传输协议之一。它可以用来将文件从本地计算机上传到远程服务器或者将服务器上的文件下载到本地计算机中。 本文将介绍如何使用FTP进行文件传输。 FTP客户端软件的安装 在使用FTP进行文件传输之前,需要先安装FTP客户端软件。目…

    其他 2023年3月28日
    00
  • XPath常用定位节点元素语句总结

    XPath常用定位节点元素语句总结的完整攻略 XPath是一种用于在XML和HTML文档中定位节点的语言。在Web开发中,XPath常用于爬虫、自动化测试等场景。本文将详细讲解XPath常用定位节点元素语句的完整攻略,包括基本概念、语法规则、常用函数和两个示例说明。 基本概念 在XPath中,节点是文档中的基本元素。节点可以是元素、属性、文本、注释等。XPa…

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