java类加载机制-类定义中new如何理解
高洛峰
高洛峰 2017-04-18 10:46:41
0
5
859
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(5)
黄舟

在运行 java 程序的时候,每个类只被加载一次。不可能重复加载的。所以也就不存在题主说的递归了。

洪涛

推荐先了解一下JVM虚拟机中内存

AVA对象实例化过程中,主要使用到的包括虚拟机栈,JAVA堆和方法区。
JAVA文件经编译之后首先会被加到到JVM方法区,JVM方法区中很重要的一个部分是运行时常量池——用以存储class文件类的版本、字段、方法、接口等描述信息和编译期间的常量和静态变量。
JAVA对象真正进行实例化的地方在JAVA堆和虚拟机栈中,Object A = New Object();在实际内存中,A其实相当于我们给Ojbect这个类的实现起的一个名字,在面向对象编程中,就像狗是属于一类动物,但是特指的那一条狗我们会给他起一个名字用以区分一样。Object用以标记A是属于这个类,而A是特指Object的一个具体实现,而New Object就相当于对这个类创建一个具体实现。所以我们可以了解到,一个对象他首先必须可以指明所属的类,其次它还必须能指明他所特指的哪一个具体实现。
对应的有两种实现方式:

1.句柄访问对象

2.直接指针访问对象
直接指针访问对象

HotSpot采用的是第二种实现方式。
Class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize)
加载
根据上图所示,我们不难理解,当一个对象进行实例化的时候,JVM会根据所需对象类型在JAVA堆中划分内存区,并生成指向方法区对象数据类型的指针用以标识对象。
链接
虚拟机栈中的本地变量表(也有称为局部变量表)中指针指向JAVA堆中划分好的内存区域。JAVA虚拟机采用动态链接方式,只有编译后的class文件并未存储最终方法在内存的表现形式。
初始化
初始化实际上是对class文件中的初始化方法进行调用,其核心还是虚拟机栈中栈帧的一次POP/PUSH。相当于对类中的对象进行一次同样的装载过程。
至此,一个对象完整的实例化过程就全部介绍完毕。

类内部初始化顺序为 静态域->非静态域->构造方法

推荐看一下:
【JAVA笔记——道】对象生命周期详解
【JAVA笔记——道】Class初始化理解

PHPzhong

是不是把类加载和对象初始化搞混了?

刘奇

楼主是不是想的太高深了?实例化和声明定义是2个概念和阶段。
A2有几个静态的成员变量在声明时实例化,而类的实例化过程是通过构造函数完成的。
这里看上去出现了嵌套,其实不然。编译器可以在编译实例化语句的时候申明指令跳转,跳转地址在二次编译的时候确定。
这样,类申明阶段,在实例化a,b,c,d的时候编译程序会跳转到A2(int i)的构造方法程序块。
在类实例化阶段的时候跳转到A()构造方法。
说白了就是在不同阶段调用对应的构造方法而已,没有楼主以为的循环嵌套。

Peter_Zhu

类加载时,对于静态变量和构造方法的加载顺序不一样吧。构造方法本质也是静态方法。
也不怎么懂,先占个板凳

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!