java中类的加载过程和对象的创建过程
1.类加载过程
首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到方法区。在类的加载过程中,该类的静态成员变量(static)加载到方法区的静态区域,非静态成员变量加载到方法区的非静态区域。加载静态成员变量时,会根据书写的顺序,将所有的静态成员变量加载到方法区的静态区域。然后给所有的静态成员变量赋默认值,然后,根据静态成员变量的书写位置,给静态成员变量赋显示值。赋值完成后,再去根据位置执行静态代码块。执行完代码块后,类加载完成。
类加载步骤:
1.jvm先去方法区中寻找有没有相应类的.class文件。如果有,就直接运行使用,如果没有,则把相应类的.class加载到方法区
2..class的加载过程,先加载该类的非静态内容,再加载静态内容
3.加载非静态内容:把.class中所有非静态内容(包括成员变量和方法)全部加载到方法区中的非静态区域内、
4.加载静态内容:
1.把.class中所有的静态内容(包括静态成员变量和静态方法)全部加载到方法区的静态区域
2.静态内容加载完成后,静态成员变量或者静态代码块的执行过程,则要根据他们定义的位置来。不过我们一般将静态成员变量定义在前面,静态代码块定义
在最后面。因此一般过程如下
3.根据位置进行静态成员变量的初始化
3.所有的静态成员变量默认初始化完成后,再进行他们的显示初始化
4.当静态区域下的所有静态成员变量显示初始化完成后,根据顺序执行静态代码块
5.当静态代码块执行完成之后,整个类的加载就完成了
2.对象创建过程
1.在堆内存中开辟一块空间
2.给开辟的空间分配一个地址
3.把对象的所有非静态成员变量加载到堆中开辟的空间下
4.所有的非静态成员变量加载完成后,对所有的非静态成员变量进行默认初始化
5.非静态成员变量默认初始化完成之后,调用构造函数
6.在构造函数入栈执行时,分为两个部分,先执行构造函数中的隐式三步,再执行构造函数中的书写的代码。
6.1隐式三步
1.执行super构造
2.对开辟空间下的所有非静态成员变量进行显示初始化
3.执行构造代码块
7.在整个构造函数执行完并且弹栈后,把空间分配的地址值赋值给一个引用对象
.1.
类加载过程:
首先,
jvm
在执行时,遇到一个新的类时,会到内存中的方法区去找
class
文件,如果找到
就直接拿来用,如果没有找到,就会到硬盘中去找到这个
class
文件,将类文件加载到方法
区,
在类加载时,
静态成员变量加载到方法区的静态区域,
非静态成员变量加载到方法区的
非静态区域,
加载静态成员变量的时候,
会根据书写的顺序,
将所有的静态成员变量加载到
静态方法区,
然后给所有的静态成员变量赋默认值,
赋完默认值后,
会根据静态成员变量书
写的位置,
给静态成员变量赋显示值,和执行静态代码。
当执行完所有的静态代码块时,类
才算加载完成。
类加载过程:
1
,
JVM
会先去方法区中找有没有相应类的
.class
存在。如果有,就直接使用;如果没有,
则把相关类的
.class
加载到方法区
2
,
在
.class
加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容
3
,
加载非静态内容:把
.class
中的所有非静态内容加载到方法区下的非静态区域内
4
,
加载静态内容:
4.1
、把
.class
中的所有静态内容加载到方法区下的静态区域内
4.2
、静态内容加载完成之后,对所有的静态变量进行默认初始化
4.3
、所有的静态变量默认初始化完成之后,再进行显式初始化
4.4
、当静态区域下的所有静态变量显式初始化完后,执行静态代码块
5
,当静态区域下的静态代码块,执行完之后,整个类的加载就完成了。
2.
对象创建过程:
1
,
在堆内存中开辟一块空间
2
,
给开辟空间分配一个地址
3
,
把对象的所有非静态成员加载到所开辟的空间下
4
,
所有的非静态成员加载完成之后,对所有非静态成员变量进行默认初始化
5
,
所有非静态成员变量默认初始化完成之后,调用构造函数
6
,
在构造函数入栈执行时,分为两部分:先执行构造函数中的隐式三步,再执行构造函数
中书写的代码
6.1
、
隐式三步:
1
,执行
super
语句
(继承时讲解)
2
,对开辟空间下的所有非静态成员变量进行显式初始化
3
,执行构造代码块
6.2
、在隐式三步执行完之后,执行构造函数中书写的代码
7
,在整个构造函数执行完并弹栈后,把空间分配的地址赋值给一个引用对象
java中类的加载过程和对象的创建过程的更多相关文章
- Java中类的加载、连接和初始化
Java中类的加载.连接和初始化 类的加载.连接和初始化 先介绍一下JVM和类 JVM和类: 当我们调用Java命令运行某个Java程序时,该命令将会启动一个Java虚拟机进程,不管该Java程序有多 ...
- java 中类的加载顺序(转)
1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始 ...
- 从经典面试题看java中类的加载机制
1.概述 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助. 由于Ja ...
- java中类的加载顺序介绍(ClassLoader)
转自:http://blog.csdn.net/eff666/article/details/52203406 1.ClassNotFoundExcetpion 我们在开发中,经常可以遇见java. ...
- Java 中类的加载顺序
如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序是什么? 测试代码如下: Class B: pub ...
- java中类的加载情况
当一个类存在继承且与其他类有关联情况时,类中各模块加载顺序如下: 1.首先找到public类,判断该类是否继承其他类,如果没有继承其他类(Object类除外),则加载该类:否则转去加载该类的超类,超类 ...
- java 类的加载,链接,初始化
本篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码 ...
- Java类的加载 链接 初始化
原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够 ...
- java class加载机制及对象生成机制
java class加载机制及对象生成机制 当使用到某个类,但该类还未初始化,未加载到内存中时会经历类加载.链接.初始化三个步骤完成类的初始化.需要注意的是类的初始化和链接的顺序有可能是互换的. Cl ...
随机推荐
- package-cleanup
package-cleanup 是一个python开发的命令程序,用来清除本机已安装的.重复的 或孤立的软件包. desktop版的CentOS镜像包含这个工具,而Minimal版的CentOS镜像不 ...
- Ubuntu(Linux)下如何用源码文件安装软件
在Ubuntu中附带了丰富的软件,这些软件一般使用图形化的自动方式(“添加/删除”或“新立得”)即可轻松安装,但是对于那些刚刚问世的新软件,Ubuntu的源中还未收录其中,这时我们就需要用到一种更通用 ...
- C# Excel数据导入到数据库
http://www.jb51.net/article/44743.htm 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码: 复制代码 代码如下: using System ...
- Python的locals()函数
Python的locals()函数会以dict类型返回当前位置的全部局部变量. 示例代码: def func(): arg_a, arg_b = 'a', 'b' def func_a(): pass ...
- flex盒模型实现头部尾部固定
近期做移动app.wap等站,需要头部固定在顶部,不随着内容滚动而滚动平时第一想法就是使用position:fixed;top:0;z-index:10;这样去实现但这样使用fixed之后,会在ios ...
- docker:(3)docker容器挂载宿主主机目录
有一项重要的参数 -v 目录挂载,就是让容器内部目录和宿主主机目录关联起来,这样就可以直接操作宿主主机目录而不用再操作具体容器了 比如在2中,我们要发布一个war包,是通过 sudo docker c ...
- Spark入门,概述,部署,以及学习(Spark是一种快速、通用、可扩展的大数据分析引擎)
1:Spark的官方网址:http://spark.apache.org/ Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL.Spark Streaming.Graph ...
- Excel Microsoft.Jet.OLEDB.4.0 外部数据库驱动程序中(1)的意外错误
昨天更新系统的bug,据说是微软要搞事情啊 删除以下更新就行: win7 KB4041678 KB4041681 SERVER 2008 R2 KB ...
- Lua和C的语法差别
没有main函数 Lua是脚本语言,没有固定入口的main函数.当lua解析器解析某个lua代码文件时,lua解析器一样一行的解析lua脚本. print("Hello lua") ...
- conda虚拟环境实践
1.查看本地创建了那些python版本 which python whereis python which主要用来查找可直接执行的命令,可以查找别名.whereis比which的搜索范围大了一些,同时 ...