java 类的加载、连接和初始化

JVM和类

调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区。当系统出现以下几种情况时,JVM进程将被终止:

  • 程序运行到最后正常结束;
  • 程序运行到使用System.exit()或Runtime.getRuntime.exit()代码结束程序;
  • 程序运行过程中遇到未捕获的异常或错误而结束;
  • 程序所在的平台强制结束了JVM进程。

类的加载

当程序主动使用某个类时,如果该类还没有被加载到内存中,系统会通过加载、连接、初始化这三个步骤来对该类进行初始化(如果没有意外,JVM将会连续完成这三个步骤,所以有时也会把这三个步骤统称为类的加载或初始化)。

类的加载是指将类的class文件读入内存,并为之创建一个java.lang.Class对象(注意并不是目标类的对象)。也就是说当程序中使用任何类时都会为之创建一个java.lang.Class对象。

类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是Java程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。

通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种数据来源:

  • 从本地文件系统加载class文件;
  • 从jar包中加载class文件;
  • 通过网络加载class文件;
  • 把一个Java源文件执行动态编译,并执行加载。

java通常无需等到“首次使用”该类时才加载该类,Java虚拟机允许系统预先加载某些类。

类的连接

当类被加载后,系统会为之生成一个对应的Class对象,接着就会进入类的连接阶段。

类的连接阶段负责把类的二进制数据合并到JRE中。类的连接又可以分为如下三个阶段:

  • 验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致;
  • 准备:类的准备阶段则负责为类的静态属性分配内存,并设置默认初始值;
  • 解析:将类的二进制数据中的符号引用替换成直接引用。(关于符号引用和直接引用我觉得这里说的非常明白)

类的初始化

在类的初始化阶段,虚拟机负责对类进行初始化,主要是对静态属性进行初始化。在java类中对静态属性进行初始化有两种方式:

  • 声明静态属性时指定初始值;
  • 使用静态初始化块为静态属性指定初始值。

进行初始化时,JVM会按语句在程序中的排列顺序依次执行初始化。如下面的代码,最终b的值为9。

package com.zhyea.test;public class Test {static{b=6;}static int a = 0;static int b = 9;}

JVM对类进行初始化时包含如下步骤:

  • 假如这个类还没有被加载和连接,程序先执行加载并连接这个类;
  • 假如该类的直接父类还没有被初始化,则先初始化其直接父类;
  • 假如类中有初始化语句,则系统依次执行这些初始化语句。

根据如上步骤可以看出来,当程序主动使用任何一个类时,系统会保证该类以及所有父类都会被初始化。

类初始化的时间

系统开始初始化类或接口的时间包括一下6种情况:

  • 创建类的实例;
  • 调用某个类的静态方法;
  • 访问某个类或接口的静态属性,或为该静态属性赋值;
  • 通过反射方式来创建某个类或接口对应的java.lang.Class对象,如使用Class.forName(“Person”);
  • 初始化某个类的子类。初始化子类时,所有的父类都会被初始化;
  • 直接使用java命令来运行某个类时。

需要一提的是final修饰的静态属性,如final修饰的静态属性在编译时就得到了属性值,那么该静态属性就会被当作常量不会被初始化(类的编译做了哪些事情呢,这里需要考虑下)。如下面这种情况:

final static int MON = 1;

final修饰的静态属性未能在编译时得到属性值,那么就会被初始化,如下面这种情况:

final static int TUE = 1+1;

还值得一提的就是ClassLoader的loadClass方法并不会执行类的初始化,而是只执行了类的加载。

转载于:https://www.cnblogs.com/amunote/p/4170627.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

讯雷使用小技巧

迅雷是大家平时用得最多的下载软件,但是很多人可能平时只是简单地使用。不过,有时经验是十分有用的。养成使用迅雷的良好习惯,相当有用。本文主要介绍使用迅雷的一些经验,在此跟大家分享。一、尽量不将迅雷安装于系统盘 大家在安装…

机器人等级考试一级教具_全国青少年机器人技术等级考试(一级):基本结构...

​机器人技术,是衡量一个国家科技创新和高端制造业水平的重要标志。大力推动机器人技术创新与行业发展,关键在于人才的培养。少年强,则国强。机器人作为信息化教育的新载体,不仅要让更多中国青少年了解机器人的发展,掌…

react dispatch_React测试的那些事(三) React Hook 测试实例

useReducer测试 useReducer 首先需要在组件中用 actions 和 reducers ,代码如下。Reducerimport * as ACTIONS from ./actionsexport const initialState {stateprop1: false, }export const Reducer1 (state initialState, action) > {switch(action.type) {…

java中的堆和栈

1.简单的说:Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过…

Blazor 组件库开发指南

翻译自 Waqas Anwar 2021年5月21日的文章 《A Developer’s Guide To Blazor Component Libraries》 [1]Blazor 的核心是组件,我们创建不同类型的组件并在整个项目中重用它们。没有人想重复造轮子,因此创建一个可重用的 Blazor 组件库始终是一个好主意&a…

今年大学毕业照画风太清奇.....我忍不住笑出了声!

全世界只有3.14 % 的人关注了爆炸吧知识转眼又到毕业季,今年毕业季因疫情有些不一样。PS云毕业照、云答辩、云面试,不少毕业生调侃自己是“云毕业”。最近不少大学生在网上哀嚎,原因是学校要他们上交照片,以便制作毕业照&#xff…

exec和sp_executesql

sqlserver中的exec和sp_executesql都能执行动态的sql语句和存储过程,但exec用法较为简单,不能带参数,也没有返回参数。 sp_executesql则显得功能更加完善,可以用输入参数和输出参数,下面这个例子记录了sp_executesql的…

计算机高效课堂建设,打造职业学校计算机高效课堂.doc

精品文档(可编辑) 值得下载打造职业学校计算机高效课堂近年来,随着社会的不断发展和经济的快速增长,职业教育越来越受到重视,很多企业在招聘时看重的是学生的专业技能,因此,职业学校须高度重视学校的教学质量&#xff…

彻底解决.net中编码问题的心得

本文将解决.net(c#)系统中因编码转换而出现的乱码问题。最近的系统与字符集打交道,字符集的编码是一个非常头疼的事情,不小心就会造成乱码。深入学习编码知识,可以使我们在写程序时少走弯路。 要实现的功能:将一大堆网页文件批量导…

sql语句查询结果合并union 和union all用法

--合并重复行select * from Aunionselect * from B --不合并重复行select * from Aunion allselect * from B 按某个字段排序--合并重复行select *from (select * from Aunionselect * from B) AS Torder by 字段名 --不合并重复行select *from (select * from Aunion allselec…

vc 控制台添加托盘显示_开源:ESP8266读DHT11温湿度,小程序实时显示

第一、原理讲解原理简述:利用发布订阅模式。第一步,先读取DHT11温湿度数值,第二步,新建主题,然后esp8266往这个主题发送消息,第三步。小程序通过http API接口获取数据。小程序控制原理:esp8266订…

python if elif else_python:通讯录(字典+while+if/else)

Hello,World.我是很久很久很久都没有更新的土土[看]但是即便如此呢我这个人也不喜欢拖拖拉拉的东扯西扯一上来咱们就来讲讲正题勿怪[笑哭]1.使用字典构建通讯录mydic{}//定义一个字典2.使用whlie循环判断是否继续进行while True://循环开始break//循环结束3.使用if/elif/else语…

有BUG!!!慎用default文本

前言下面这段代码,你能发现什么问题吗?public static int? Test1(string str) {return str switch{"A" > 1,"B" > 2,"C" > 3,_ > default,}; } public static int? Test2(string str) {switch (str){case &…

老师看完都吐血的五道题

全世界只有3.14 % 的人关注了 爆炸吧知识 老师看完都要吐血的五道题哈哈哈哈哈虽然小编觉得最后一答完全没问题哈哈哈图片来源于网络,如有侵权请联系删除。你点的每个在看,我都认真当成了喜欢

JDK5.0新特性--可变参数

2019独角兽企业重金招聘Python工程师标准>>> /*** 可变参数*/ public class VariableParamater {/*** 统计2个或多个数的和*/public static void main(String[] args) {//计算2个数的和sum(10,15);/** 问题:如果要计算3个数、4个数、5个数或n个数的和&am…

中职计算机教师考核工作总结,中职计算机教师工作总结.doc

中职计算机教师工作总结中职计算机教师工作总结一个学期以来,认真真学习贯彻党的教育方针政策策,落实上级领导的工作部署署,以重实际,抓实事,求实实效为教学工作的基本原则,,以培养学生创新精神…

爱情二十九课,驾驭爱情

每个人都期待驾驭爱情,都希望让恋人终生痴情于自己,也希望爱情保持新鲜,但爱情是一种非常飘渺的心理因素,能驾驭爱情的技巧是什么呢……大部分人常用的战术有3种: 第一种 用内疚感来驾驭 在发现爱情温度下降时&#xf…

欧几里得距离网络_使用Tensorflow对象检测模型和OpenCV的社交距离和遮罩检测器...

将深度学习和计算机视觉相结合的隔离项目社会距离化这个术语已席卷全球,正在改变着我们的生活方式。社交距离也称为“物理距离”,是指在您自己与其他并非来自家庭的人之间保持安全的空间。随着该国开始在激增的COVID-19案件中发挥作用,保持社…

python 实现点击右键用某个程序打开功能_工欲善其事,必先利其器(1)——Python开发环境安装与配置...

Life Is Short, You Need Python.近年来随着Python的火爆,很多人想要学习并使用Python,本文将详细介绍一套Python开发环境的安装与配置,相比Python自带的IDEL,在此环境下将极大的提高开发效率。下面就让我们一步步的开始安装&…

开源实体映射框架EmitMapper介绍

概述对象—对象映射的一种传统做法就是创建许多数据转换对象。这些对象负责在众多数据对象之间复制数据。对于拥有大量数据对象的程序而言,开发人员需要花费大量的时间精力编写大量的数据转换对象来支持数据对象映射。这一过程非常无聊沉闷,而且容易出现…