JAVA中类的加载机制

南京邮电大学《数学实验》模块二(函数的迭代)参考答案 【代码】南京邮电大学《数学实验》模块二(函数的迭代)参考答案。 阅读详情

java中类的加载机制

看了很多论坛,自己总结了java中类的加载机制,这里先修正一个问题,关于静态变量和静态代码块的加载顺序问题,下面表述的先加载静态代码块在加载静态变量的顺序是有问题的,其实是谁写在前面谁先加载,比如我将代码块放在变量前面,代码块就会优先加载,从而访问不到未初始化的变量,非静态变量和代码块也是如此.

  • 概述
  • 类加载器
  • 类加载的过程
  • 子类和父类加载顺序

1.概述

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

由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。

JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。

2.类加载器

类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。

  • Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
  • Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
  • System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

3.类加载的过程

下图是我总结的一个java类被jvm加载的过程。
这里写图片描述

4.子类和父类加载顺序

下图是我总结的一个java类被jvm加载的过程。

比如下面的面试题:

class B{
    //静态变量
    static int i=1;
    //静态语句块
    static {
        System.out.println("Class B1:static blocks"+i);
    }
    //非静态变量
    int j=1;
    //静态语句块
    static{
        i++;
        System.out.println("Class B2:static blocks"+i);
    }
    //构造函数
    public B(){
        i++;
        j++;
        System.out.println("constructor B: "+"i="+i+",j="+j);
    }
    //非静态语句块
    {
        i++;
        j++;
        System.out.println("Class B:common blocks"+"i="+i+",j="+j);
    }
    //非静态方法
    public void bDisplay(){
        i++;
        System.out.println("Class B:static void bDisplay(): "+"i="+i+",j="+j);
        return ;
    }
    //静态方法
    public static void bTest(){
        i++;
        System.out.println("Class B:static void bTest():    "+"i="+i);
        return ;
    }
}

class A extends B{
    //静态变量
    static int i=1;
    //静态语句块
    static {
        System.out.println("Class A1:static blocks"+i);
    }
    //非静态变量
    int j=1;
    //静态语句块
    static{
        i++;
        System.out.println("Class A2:static blocks"+i);
    }
    //构造函数
    public A(){
        super();
        i++;
        j++;
        System.out.println("constructor A: "+"i="+i+",j="+j);
    }
    //非静态语句块
    {
        i++;
        j++;
        System.out.println("Class A:common blocks"+"i="+i+",j="+j);
    }
    //非静态方法
    public void aDisplay(){
        i++;
        System.out.println("Class A:static void aDisplay(): "+"i="+i+",j="+j);
        return ;
    }
    //静态方法
    public static void aTest(){
        i++;
        System.out.println("Class A:static void aTest():    "+"i="+i);
        return ;
    }

public class Tests{

    @Test
    public void test(){
        A a=new A();
        a.aDisplay();
    }

}

执行结果:

Class B1:static blocks2
Class B2:static blocks3
Class A1:static blocks1
Class A2:static blocks2
Class B:common blocksi=4,j=3
constructor B: i=5,j=4
Class A:common blocksi=3,j=2
constructor A: i=4,j=3
Class A:static void aDisplay(): i=5,j=3

可能这里面最迷惑人的就是两个成员变量了,一个静态的一个非静态的。

其实他们出现在这是貌似没啥太大意义,父类和子类虽然拥有着同名的成员变量,但是,这些变量都独自存在于各自的类中,并有各自的只。

言归正传,由上面的面试题,我们可以得出下面的规律:
这里写图片描述

另附上张类加载图,希望对大家有所帮助

这里写图片描述

WPF实战:HelixToolkit 3D图形开发入门指南 本文详细介绍了如何使用HelixToolkit在WPF中进行3D图形开发,从环境搭建到创建第一个3D程序(如彩色立方体),再到进阶技巧和常见问题排查。通过实战案例和性能优化建议,帮助开发者快速掌握3D场景构建和模型导入技术,提升开发效率。 阅读详情

相关推荐

K210视觉项目上位机避坑指南:解决C#解析ESP8266 TCP图像流的乱码、卡顿与连接中断

本文详细解析了K210与ESP8266在视觉项目中的上位机开发问题,重点解决TCP图像流解析中的乱码、卡顿与连接中断问题。通过自定义协议、JPEG流重组、TCP连接优化等实战技巧,提升系统稳定性和性能,适用于嵌入式视觉开发者和C#上位机程序员。

weixin_28730131的博客 402

Java类的加载机制

Java类的加载机制、类的加载过程、加载、链接(验证、准备、解析)、初始化、使用、卸载、类的加载器、类的加载方法、实例的加载方法

骑个小蜗牛的博客 2万+

从网格划分到结果解读:一次完整的子弹侵彻LS-DYNA仿真避坑指南

本文详细解析了子弹侵彻LS-DYNA仿真中的关键技术与避坑指南,涵盖网格优化、对称边界条件设置、沙漏控制参数调整及结果可信度验证。通过HyperMesh网格划分和LS-DYNA高级参数配置,帮助工程师提升仿真精度与效率,确保计算结果物理可信。

weixin_29816689的博客 406

一文搞懂Java类加载机制

初始化阶段是执行类构造器()方法的过程。

BarackYoung的博客 5431

从入门到精通:MediaGo跨平台部署全攻略,Docker+NAS实战案例深度拆解!

本篇将深入解析开源媒体处理工具MediaGo的运作机制,该软件具备跨平台兼容性,支持Windows、MacOS及Linux三大主流操作系统。其核心创新在于采用模块化架构设计,用户无需额外依赖任何插件即可完成快速部署。作为GitHub平台上的开源项目,该工具特别注重用户体验设计,通过Docker容器化方案可无缝接入各类网络存储设备,显著优化系统资源占用并提升数据处理效率。以飞牛云NAS系统为实施案例,本文将详细展示本地化部署全流程。

Yawesh的博客 1954

perftest实战:从零到一,精准评估RDMA网络性能

想象一下,两台服务器传输数据就像在同一个主板上交换内存,这种零拷贝、低延迟的特性,正是高性能计算、分布式存储等场景梦寐以求的。对于云环境用户,主流云厂商现在都提供RDMA实例(比如AWS的EFA、阿里云的eRDMA)。但要注意,不同机型支持的RDMA协议版本可能不同,这会直接影响测试结果的上限值。记得记录每次测试的BW average值,绘制成曲线图后,你可能会发现类似"阶梯状"的性能变化,这通常与网卡的DMA引擎设计有关。在云环境中,由于虚拟化层的影响,延迟会比裸金属高20-30%。

weixin_28700411的博客 215

一文看懂Java的类加载机制

Java的类加载机制是Java虚拟机的一个重要组成部分,它负责将类加载到内存中,并确保类的正确性。了解这个机制有助于开发者更好地理解Java程序的运行方式,并能够更好地应对类加载相关的问题。

HSQdePYZ的博客 991

ST-CNN实战:用Python实现交通流量预测(附完整代码)

本文详细介绍了如何利用时空卷积神经网络(ST-CNN)进行交通流量预测的实战过程。通过Python和PyTorch,从数据预处理、构建邻接矩阵,到ST-CNN核心模块的代码实现与模型训练,提供了完整的解决方案,帮助开发者掌握处理时空序列数据的核心算法。

rust6ferris的博客 928

Java类加载机制(通俗易懂版)

类是在运行期间第一次使用时,被类加载器动态加载至JVM。JVM不会一次性加载所有类。因为如果一次性加载,那么会占用很多的内存。Java类加载机制是指在Java程序运行时,将类文件加载到内存中的一系列步骤。Java的类加载机制遵循着“按需加载”的原则,也就是说,只有在需要用到某个类的时候,才会将这个类的相关信息加载到内存中。这种“按需加载”的设计使得Java程序具备了很好的灵活性和效率。

weixin_52572813的博客 1392

华硕笔记本+Ubuntu 20.04:用cpupower解决Intel CPU频率上不去/功耗墙问题实战

本文详细介绍了在华硕笔记本Ubuntu 20.04系统下使用cpupower工具解决Intel CPU频率受限和功耗墙问题的实战方法。通过禁用Intel P-State驱动、配置userspace模式以及高级调优技巧,帮助用户突破性能瓶颈,提升编译和计算效率。

weixin_42561476的博客 525

【QNX+Android虚拟化方案】129 - USB眼图参数配置

【QNX+Android虚拟化方案】129 - USB眼图参数配置

|~~~热爱生活、努力学习的小伙汁~~~| 821

Java类的加载机制详解

类的加载机制是指将.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在Java堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。这个Class对象不仅封装了类的数据结构,还向Java程序员提供了访问方法区内数据结构的接口。类的加载机制是Java虚拟机的重要组成部分,它确保了.class文件能够正确地被加载、连接和初始化,从而生成可以被虚拟机直接使用的Java类型。

2403_86822198的博客 459

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

java类的加载机制

类的加载机制 java虚拟机一般使用java类的流程:首先将开发者编写的java源代码编译成字节码文件,然后类加载器会读取字节码文件,并转换成java.lang.Class对象,java虚拟机利用反射方式创建真正的对象。类加载器多继承于ClassLoaderlei类。 类加载器 BootstarpClassLoader启动类加载器, 加载JAVA_HOME/jre/lib的jar包 EXTens...

cherry的博客 188

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 类的加载机制

生命周期 Java类在虚拟机中的生命周期包括以下几个阶段:加载、验证、准备、解析、初始化、使用和卸载七个阶段,前五个阶段都可以归纳为 验证、准备、解析阶段可归纳为链接阶段 加载 这个阶段的JVM主要工作是从网络或者 磁盘中读取Java字节码并且转化成二进制流加载到内存中(方法区内),接着会在方法区创建对应的class对象,该class对象是该类的各个数据的访问入口 。 Java字节码的存储...

奔跑的五花肉 999

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java中类的加载机制

Java中类加载机制 1.类的生命周期 加载—>验证à准备à解析—>初始化à使用à卸载 其中解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持Java的动态绑定。 2.类初始化时机 虚拟机规范中并没有强制约束何时进行加载,但是规范严格规定了有且只有下列五种情况必须对类进行初始化(加载、验证、准备都会随着发生): 遇到new、getstatic、putstatic ...

Atalanta1的博客 330

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java 类的加载机制_Java 类加载机制详解

一、类加载器类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加载器的功能。我们可以利用类加载器,实现类的动态加载。二、类的加载机制在Java中,采用双亲委派机制来实现类的加载。那什么是双亲委派机制?在Java Doc中有这样一...

weixin_34474759的博客 102

java 类编译_Java类编译、加载、和执行机制

Java类编译、加载、和执行机制标签: java 类加载 类编译 类执行 机制0.前言个人认为,对于JVM的理解,主要是两大方面内容:Java类的编译、加载和执行。JVM的内存管理和垃圾回收机制。本文主要是以概要的形式学习第一点:类的编译、加载和执行。关于内存管理机制请看另外一篇文章JVM的内存管理和垃圾回收机制。1. Java类的编译过程这是由*.java源码文件转为 .class二进制字节码文...

weixin_32784349的博客 347

Java:简述类的加载机制-初始化

如果Class是类而不是接口,且Class的父类Super Class(SC)和各个接口SIn(按照implements子句中的顺序来)还没有初始化,那么就在SC上面递归地进行完整的初始化过程,如果有必要,需要先验证和准备SC;如果SC或SIn初始化过程中抛出异常,则获取LC,将Class标记为错误状态,并通知所有正在等待的线程,然后释放LC,然后再抛出同样的异常。类的初始化阶段,是真正开始执行类中定义的java程序代码(.class字节码),并按程序员的意图去初始化类变量的过程。

王小二(海阔天空) 573

java中类的加载_Java中的类和类加载机制

主要介绍以下几方面内容(理解 Class 类、理解 Java 的类加载机制、学会使用 ClassLoader 进行类加载)1.理解Class类每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。Class 对象只能由系统建立对象一个类在 JVM 中只会有一个Class实例每个类的实例都会记得自己是由哪个 Class 实例所生成1:Cl...

weixin_30109877的博客 280

java 类的加载机制详解

类加载 java程序运行时类加载的方式和流程是: 编译 》加载 》验证 》准备 》解析 》初始化 编译:将java代码编译为字节码文件 加载:查找并通过io读入字节码文件,在内存中生出一个代表类的class对象,作为访问方法区的 输入入口,使用到类的时候才会加载 验证:字节码的校验,是否正确 准备:给类的静态变量分配内存,并赋予默认值 解析:将符号引用替换为直接引用,静态链接过程 初始化:对类的静态遍历,初始化指定值,执...

邋遢道的博客 1846

java 加载中_Java中类的加载机制

1.什么是类的加载?将类的.class文件中的二进制数据读入内存当中,将其放在运行时数据区的方法区内,然后再堆上创建一个java.lang.class对象,用来封装类在方法区的数据结构。注意 类的加载最终的产品是class对象。2.类的生命周期:加载.验证。准备 解析 初始化 ,其实在真是的类的加载中并不一定是按照这个顺序进行的,解析阶段有可能延时执行,这与Java语言的加载机制有关Java支持动...

weixin_29305337的博客 133

java中类的加载机制

原文链接:https://blog.youkuaiyun.com/qq_16216221/article/details/716005351.概述类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助。由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类...

sinat_39587248的博客 157
上一篇: JavaWeb三大技术之Filter
我叫小登
博客等级 码龄9年 13粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值