Java中类的加载顺序详细剖析 ClassLoader (java中类成员的访问限定符有)

Java中类的加载顺序详细剖析 ClassLoader (java中类成员的访问限定符有)

本文目录导航:

Java中类的加载顺序详细剖析(ClassLoader)

Java类的加载顺序,重要由类加载环节、链接阶段、初始化阶段以及加载器层级选择。

类加载环节分为加载、链接和初始化三个阶段,其中加载阶段经过类的全限定名失掉二进制字节流,将其转化为方法区的运转时数据结构,并在Java堆中生成Class对象作为入口。

链接阶段蕴含验证、预备和解析三个步骤,区分确保类的正确性、为静态变量调配内存并初始化为自动值,以及将符号援用转换为间接援用。

初始化阶段在类被创立实例、访问静态变量或方法、调用静态方法、反射加载类或类子类初始化时触发,分为静态变量和静态初始化块、变量和初始化块,最后口头结构器。

类的加载最终产品为堆区中的Class对象,提供方法访问方法区内的数据。

加载类的方式包括从本地系统、网络、归档文件、数据库中或灵活编译源文件。

类加载由ClassLoader及其子类口头,类的档次相关和加载顺序由图示示意。

BootstrapClassLoader担任外围类加载,ExtensionClassLoader加载裁减配置类,AppClassLoader解决类path指定的类,CustomClassLoader是依据运行需求自定义的加载器。

类加载器顺序遵照自底向上审核已加载类,保障惟一性,自顶向下尝试加载类。

BootstrapLoader为最顶层,无父加载器。

类的承袭相关选择了加载顺序,如C承袭B,B承袭A,C依赖D,则创立C时智能加载B和D,B加载A。

一切变量初始化终了后口头结构方法,静态成员的初始化优先于个别成员。

类对象创立和静态块访问触发类加载。

类结构方法顺序经过代码示例展现,强调静态成员类优先加载,成员初始化后口头结构方法,静态成员初始化与静态块口头出当初类加载阶段。

总结类加载顺序的关键点,蕴含基类优先加载、静态成员优先初始化、结构方法在成员初始化后口头、静态成员初始化与静态块口头同步于类加载。

参考博文/eff666/ar...补充类结构方法顺序示例:口头结果:因此,论断是:参考博文/xing/...

java中全限定名和相对门路有什么区别

全限定名有相对门路的意思,比如一个文件file的寄存门路,其相对门路或许是/usr/local/sbin/file这个名词也用在其他中央,比如Java类包的定,从最原始最下层的中央征引到详细的对象,这就是全限定名了。

创立新对象的两种方式?

随着互联网编程开发技术的开展,编程开发言语曾经由面向程序开展成为了面向对象的编程。

当天,咱们就从两个方面来了解一下,java编程言语中如何创立新对象的。

java在new一个对象的时刻,会先检查对象所属的类有没有被加载到内存,假设没有的话,就会先经过类的全限定名来加载。

加载并初始化类实现后,再启动对象的创立上班。

咱们先假定是一次性经常使用该类,这样的话new一个对象就可以分为两个环节:加载并初始化类和创立对象。

一、类加载环节(一次性经常使用该类)

java是经常使用双亲委派模型来启动类的加载的,所以在形容类加载环节前,咱们先看一下它的上班环节:

双亲委托模型的上班环节是:假设一个类加载器(ClassLoader)收到了类加载的恳求,它先不会自己去尝试加载这个类,而是把这个恳求委托给父类加载器去实现,每一个档次的类加载器都是如此,因此一切的加载恳求终都应该传送到顶层的启动类加载器中,只要当父类加载器反应自己无法实现这个加载恳求(它的搜查范畴中没有找到所须要加载的类)时,子加载器才会尝试自己去加载。

经常使用双亲委托机制的好处是:能够有效确保一个类的全局性,当程序中出现多个限定名相反的类时,类加载器在口头加载时,一直只会加载其中的某一个类。

1、加载

由类加载器担任依据一个类的全限定名来读取此类的二进制字节流到JVM外部,并存储在运转时内存区的方法区,而后将其转换为一个与指标类型对应的对象实例

2、验证

格局验证:验证能否合乎class文件规范

语义验证:审核一个被标志为final的类型能否蕴含子类;审核一个类中的final方法能否被子类启动重写;确保父类和子类之间没有不兼容的一些方法申明(比如方法签名相反,但方法的前往值不同)

操作验证:在操作数栈中的数据必定启动正确的操作,对常量池中的各种符号援用口头验证(理论在解析阶段口头,审核能否可以经过符号援用中形容的全限定名定位到指定类型上,以及类成员消息的访问润色符能否准许访问等)

3、预备

为类中的一切静态变量调配内存空间,并为其设置一个初始值(由于还没有发生对象,实例变量不在此操作范畴内)

被final润色的static变量(常量),会间接赋值;

4、解析

将常量池中的符号援用转为间接援用(失掉类或许字段、方法在内存中的指针或许偏移量,以便间接调用该方法),这个可以在初始化之后再口头。

解析须要静态绑定的内容。//一切不会被重写的方法和域都会被静态绑定

以上2、3、4三个阶段又合称为链接阶段,链接阶段要做的是将加载到JVM中的二进制字节流的类数据消息兼并到JVM的运转时形态中。

5、初始化(先父后子)

4.1为静态变量赋值

4.2口头static代码块

留意:static代码块只要jvm能够调用

假设是多线程须要同时初始化一个类,仅仅只能准许其中一个线程对其口头初始化操作,其他线程必定期待,只要在优惠线程口头完对类的初始化操作之后,才会通知正在期待的其他线程。

由于子类存在对父类的依赖,所以类的加载顺序是先加载父类后加载子类,初始化也一样。

不过,父类初始化时,子类静态变量的值也有有的,是自动值。

终,方法区会存储以后类类消息,包括类的静态变量、类初始化代码(定义静态变量时的赋值语句和静态初始化代码块)、实例变量定义、实例初始化代码(定义实例变量时的赋值语句实例代码块和结构方法)和实例方法,还有父类的类消息援用。

二、创立对象

1、在堆区调配对象须要的内存

调配的内存包括本类和父类的一实际例变量,但不包括任何静态变量

2、对一实际例变量赋自动值

将方法区内对实例变量的定义拷贝一份到堆区,而后赋自动值

3、口头实例初始化代码

初始化顺序是先初始化父类再初始化子类,初始化时先口头实例代码块而后是结构方法

4、假设有相似于Childc=newChild()方式的c援用的话,在栈区定义Child类型援用变量c,而后将堆区对象的地址赋值给它

须要留意的是,北京IT培训发现每个子类对象持有父类对象的援用,可在外部经过super关键字来调用父类对象,但在外部无法访问

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

87阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读