java构造器_Java类加载的过程
大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务!
1、长期为你提供最优质的学习资源!
2、给你解决技术问题!
3、每天在朋友圈里分享优质的技术文章!
4、每周1、3、5送纸质书籍免费送给大家,每年至少送书800本书!
5、为大家推荐靠谱的就业单位!
请注意!我上面说的5点全部都是免费的!全网你应该找不到第二家吧!
当然,大家在我私人微信上问我问题,仅限回答web前端、java相关的。
---------------------------
好了,接下来开始今天的技术分享!上次老师跟大家分享了ArrayList底层原理及实现的知识,今天跟大家分享下Java类加载的过程的知识。
1 类的生命期
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化。可以看到类的生命周期包含了加载、验证、准备、解析、初始化、使用、卸载七个步骤,其中验证、准备和解析可以叫做一步连接。其中类的加载过程是前面的3步,加载、验证、准备、解析和初始化。
1. 加载
加载,是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建java.lang.Class对象的过程。这个过程,将类的.class文件中的二进制数据读入内存,放在运行时区域的方法区内。然后在堆中创建java.lang.Class对象,用来封装类在方法区的数据结构。
类加载阶段:
(1)Java虚拟机将.class文件读入内存,并为之创建一个Class对象。
(2)任何类被使用时系统都会为其创建一个且仅有一个Class对象。
(3)这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些构造方法,都有哪些成员方法,都有哪些成员变量等。
Student类加载过程图示:
2.链接
链接包括验证、准备以及解析三个阶段。
(1)验证阶段。主要的目的是确保被加载的类(.class文件的字节流)满足Java虚拟机规范,不会造成安全错误。
(2)准备阶段。负责为类的静态成员分配内存,并设置默认初始值。
(3)解析阶段。将类的二进制数据中的符号引用替换为直接引用。
说明:
符号引用。即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。
直接引用。可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的指针;而实例方法,实例变量的直接引用则是从实例的头指针开始算起到这个实例变量位置的偏移量。
举个例子来说,现在调用方法hello(),这个方法的地址是0xaabbccdd,那么hello就是符号引用,0xaabbccdd就是直接引用。
在解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用。
3.初始化
初始化,则是为标记为常量值的字段赋值的过程。换句话说,只对static修饰的变量或语句块进行初始化。
如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
2 对象的初始化顺序
首先对象初始化会有几个东西,构造函数,构造代码块,静态代码块,静态变量,对于构造函数,构造函数只会初始化一次,用来初始化对象,构造方法只会调用一次,对象的方法可以重复调用,对于构造方法块,同构造方法一样只会在new的时候执行一次,也是用来初始化对象的,对于静态代码块,是给类进行初始化的,只会在类初始化的时候执行一次,对于静态变量,也只会在类初始化的时候初始化一次。
对于一个类,这几个的顺序如下,静态变量和代码块优先于构造代码块优先于构造函数。对于有继承的情况,这几个的顺序如下,父类静态变量、代码块优先于自雷静态变量、代码块优先于父类变量、构造代码块、构造方法优先于子类变量、构造代码块、构造方法。
3 类加载器
类加载器用于实现类的加载,java中分为了三种类加载器,启动类加载器,拓展类加载器,应用程序类加载器,其中启动类加载器是由C++编写,用于加载JAVA_HOME>\lib目录下的类,也就是我们用到的基本的像String什么的都是这个加载器加载的。
然后是拓展类加载器是用于加载<JAVA_HOME>\lib\ext中的类,这个目录下的类不常用到,最后应用程序类加载器是加载用户自己实现的类。接下来介绍下类加载器的双亲委派模型,图示:
双亲委派模型体现了类加载器之间的层次模型,除了启动类加载器外,每个加载器都有自己的父加载器,
工作过程如下:如果类加载器收到了类加载的请求,那么会将这个请求一层一层的传递到父加载器中,当父加载器反馈自己不能加载的时候才会有这个加载器加载,这样的好处是,避免一个类被多个加载器重复加载,并且由于不同加载器加载的类是不一样的,导致程序混乱。
4 总结
类加载过程只是一个类生命周期的一部分,在其前,有编译的过程,只有对源代码编译之后,才能获得能够被虚拟机加载的字节码文件;在其后还有具体的类使用过程,当使用完成之后,还会在方法区垃圾回收的过程中进行卸载(垃圾回收)。
今天就分享这么多,关于Java类加载的过程,你学会了多少?欢迎在留言区评论,对于有价值的留言,我们都会一一回复的。如果觉得文章对你有一丢丢帮助,请点右下角【在看】,让更多人看到该文章。
java构造器_Java类加载的过程相关推荐
- java构造器_Java构造器就是这么简单!
前言 理解构造器之前,首先我们需要了解Java中为什么要引入构造器,以及构造器的作用. 在很久之前,程序员们编写C程序总会忘记初始化变量(这真的是一件琐碎但必须的事),C++引入了 构造器(const ...
- 类java的步骤_java类加载的过程
类加载就是三个过程:加载.链接.初始化 链接又可以分为验证.准备.解析 1.加载 将class字节码文件通过类加载器装入内存中 2.验证 确保当前class文件的字节流所包含的内容符合当前JVM的规范 ...
- 深入理解Java虚拟机——JVM类加载机制(类加载过程和类加载器)
一.什么是类加载机制? 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 二.类加载的时机 类 ...
- java 类加载的过程
类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution) ...
- Java类加载的过程
JVM和类 当我们调用 Java 命令运行某个 Java 程序时,该命令将会启动一条 Java 虚拟机进程,不管该 Java 程序有多么复杂,该程序启动了多少个线程,它们都处于该 Java 虚拟机进程 ...
- java类验证和装载顺序_Java类加载机制实现流程及原理详解
前言 我们知道,Java项目编译后会生成许许多多的class文件,class文件保存着类的描述信息.虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转化解析和初始化,最终形成可以被虚 ...
- 【教3妹学java】类加载的过程是什么样的?
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 2哥:"今天只有残留的躯壳,迎接光辉 ...
- Java类加载的过程原理
我们编写好的代码java代码,经过编译编程.class文件,然后类加载器把.class字节码文件加载到JVM中,接下来执行我们的代码,最后将该类卸载出JVM.而类加载到虚拟机--卸载出虚拟机,这整个生 ...
- java 构造器 构造方法_Java构造器(构造方法/constructor)
我们先来看一下什么是构造器: 1.构造器也叫构造方法或构造函数,分为有参构造器和无参构造器: 2.构造器也是一种方法,只不过是一种特殊的方法,它会在对象创建的时候被调用: 3.构造器最大的作用就是在创 ...
最新文章
- 泛前端知识图谱(Web/iOS/Android/RN)
- Spring Cloud剖析--云平台技术栈17
- 2019年度苏州之春摄影作品展
- 微信朋友圈技术之道:三个人的后台团队与每日十亿的发布量
- 系统运维手册_如何摆脱“背锅侠”,做一个合格的IT运维人员
- hbuilderx简单网页代码_Python爬取网页数据
- NYOJ 104 最大和
- 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)
- JAVA8如何进行IDEA配置_IntelliJ Idea 配置jdk8
- AUTOSAR从入门到精通100讲(二)-SOME/IP及其应用
- 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求(上)
- java大作业 俄罗斯方块_俄罗斯方块Java程序设计
- CSDN出品,必是精品:CSDN浏览器助手!
- 可以免费文字识别app有哪些?有这3款app就能够实现提取文字自由
- 垂杨柳中学2021年高考成绩查询时间,2021年北京中考各学校分数线,历年北京中考分数线...
- python网易公开课官网_可汗学院公开课:计算机科学
- 软件测试教程第2版(宫云战主编)
- 有关“凸”方面的概念:凸(集/函数/优化/二次规划)
- MATLAB优化工具箱—Optimization Toolbox™
- MySQL之中间件Mycat实现读写分离
热门文章
- LeetCode 401. 二进制手表
- LeetCode 295. 数据流的中位数(大小堆)
- NumPy快速入门-- Less 基础/线性代数
- 导Excel数据到Oracle的脚本,Oracle使用TOAD实现导入导出Excel数据
- python最好用的助手_推荐5款好用的Python工具
- 利用bootstrap框架做了一个采摘节节日活动网页
- laravel 判断字符串包含_laravel 字符串操作大全
- android闹钟测试工具,android开发:AlarmManager闹钟管理器的实例
- 详解NLP技术中的:预训练模型、图神经网络、模型压缩、知识图谱
- ICLR2020满分论文 | 为什么梯度裁剪能加速模型训练?