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中类的加载过程和对象的创建过程的更多相关文章

  1. Java中类的加载、连接和初始化

    Java中类的加载.连接和初始化 类的加载.连接和初始化 先介绍一下JVM和类 JVM和类: 当我们调用Java命令运行某个Java程序时,该命令将会启动一个Java虚拟机进程,不管该Java程序有多 ...

  2. java 中类的加载顺序(转)

    1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始 ...

  3. 从经典面试题看java中类的加载机制

    1.概述 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助. 由于Ja ...

  4. java中类的加载顺序介绍(ClassLoader)

    转自:http://blog.csdn.net/eff666/article/details/52203406 1.ClassNotFoundExcetpion  我们在开发中,经常可以遇见java. ...

  5. Java 中类的加载顺序

    如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序是什么? 测试代码如下: Class B: pub ...

  6. java中类的加载情况

    当一个类存在继承且与其他类有关联情况时,类中各模块加载顺序如下: 1.首先找到public类,判断该类是否继承其他类,如果没有继承其他类(Object类除外),则加载该类:否则转去加载该类的超类,超类 ...

  7. java 类的加载,链接,初始化

    本篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码 ...

  8. Java类的加载 链接 初始化

    原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够 ...

  9. java class加载机制及对象生成机制

    java class加载机制及对象生成机制 当使用到某个类,但该类还未初始化,未加载到内存中时会经历类加载.链接.初始化三个步骤完成类的初始化.需要注意的是类的初始化和链接的顺序有可能是互换的. Cl ...

随机推荐

  1. 手机端rem如何适配_rem详解及使用方法2

    作为一个前端开发人员,我们的任务是将UI设计师的图稿运用计算机语言呈现在用户面前.而现在的设备大小尺寸不一,近年来智能手机的普及更是让网页的用户大部分来源与手机,所以让不同大小的移动端屏幕都能较好的还 ...

  2. 字符串匹配KMP算法的C语言实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  3. javascript计算对象的长度

    计算对象的长度,即获取对象属性的个数 方法一:通过for in 遍历对象,并通过hasOwnProperty判断是否是对象自身可枚举的属性 var obj = {"c1":1,&q ...

  4. Fiddler中设置断点修改Request和Response

    Fiddler中设置断点修改Request Fiddler最强大的功能莫过于设置断点了,设置好断点后,你可以修改httpRequest 的任何信息包括host, cookie或者表单中的数据.设置断点 ...

  5. Netty之ProtoBuf(六)

    Protocol Buffer的基本使用(六) 一.简介 Protocol Buffer(简称ProtoBuf)是google的一个语言中立,平台中立,可扩展的对结构化的数据进行序列化的一种机制,和X ...

  6. 如何在MicroPython TPYBoard 添加自定义类库

    开始之前,首先要感谢一下TPYBoard技术交流群(157816561)-云之初晓网友的分享.   今天简单分享下如何将自己编写的一些Python脚本的类库添加到固件中,在使用时只需import调用, ...

  7. shell脚本的if语句,判断某程序是否存在,不存在启动该程序!

    想必大家都知道 "如果......那么......" 这种语法的应用吧! 当然呢,linux下对于这种用法也是有所考虑的,很多时候我们都需要写一个shell脚本,难免会避免if语句 ...

  8. Spark源码分析 之 Driver和Excutor是怎么跑起来的?(2.2.0版本)

    今天抽空回顾了一下Spark相关的源码,本来想要了解一下Block的管理机制,但是看着看着就回到了SparkContext的创建与使用.正好之前没有正式的整理过这部分的内容,这次就顺带着回顾一下. S ...

  9. OpenCascade Ruled Surface

    OpenCascade Ruled Surface eryar@163.com Abstract. A ruled surface is formed by moving a line connect ...

  10. SpringCloud学习笔记(4)——Zuul

    参考Spring Cloud官方文档第19章 19. Router and Filter: Zuul 路由是微服务架构的一部分.例如,"/"可能映射到你的web应用,"/ ...