java学习——java基础(十)之类加载机制

Java基础之类加载器 由上文中的流程图可以看出,类加载器负责读取Java字节代码(.class文件),并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个Java类。通过此实例的newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如Java字节代码可能是通过工具动态生成的,也可能是通过网络下载的。oracle官网把类加载器划分为两种类型java库中的平台类加载器和应用程序类加载器等用户自己写的类加载器,比如通过网络加载类等机制举例。... 阅读详情

写在前面:除了焦躁还是焦躁,唯有学习,才能静下心来。


在开发中经常会出现ClassNotFoundException这个异常,那么类是否可以找到就与类加载机制关系有着密切关系。明白类加载机制能在平时的撸码中快速的找到类加载失败等问题。


1.what is 类加载机制

Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。


2.类加载过程

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。其中到初始化之前的都是属于类加载的部分,即

类加载部分包括:加载、验证、准备、解析、初始化

其中解析也可能在初始化阶段之后,为了支持运行时绑定。


3.加载阶段

该流程是类加载机制中的一个阶段,需要完成任务包括:

(1) 通过一个类的全限定名来获取定义此类的二进制字节流;

(2) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;

(3) 在java堆中生成一个代表这个类的Class对象,作为访问方法区中这些数据的入口。

注意:相对而言,加载阶段是可控性最强的阶段,开发人员可以选择不同的类加载器完成加载。类加载完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。(这也是反射的原理)


类加载器

作用:实现类的加载动作,确定类在虚拟机中的唯一性。


类加载类型:

(1) 启动(Bootstrap)类加载器:引导类装入器是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面的核心类库或-Xbootclasspath选项指定的jar包加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

(2) 扩展(Extension)类加载器:扩展类加载器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将< Java_Runtime_Home >/lib/ext或者由系统变量-Djava.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

(3) 应用程序(Application)类加载器:系统类加载器是由 Sun的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径java -classpath或-Djava.class.path变量所指的目录下的类库加载到内存中。开发者可以直接使用系统类加载器。

(4) 自定义类加载器:JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,因此如果编写了自己的ClassLoader,便可以做到如下几点:1)在执行非置信代码之前,自动验证数字签名。2)动态地创建符合用户特定需要的定制化构建类。3)从特定的场所取得Java class,例如数据库中和网络中。当使用Applet的时候,就用到了特定的ClassLoader,因为这时需要从网络上加载java class,并且要检查相关的安全信息,应用服务器也大都使用了自定义的ClassLoader技术。

注意:如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。


双亲委派模型:



这种层次关系称为类加载器的双亲委派模型。每一层上面的类加载器叫做当前层类加载器的父加载器,它们之间通过组合关系来复用父加载器中的代码。


双亲委派工作过程:

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。


双亲委派模型好处:

Java类随着它的类加载器一起具备了一种带有优先级的层次关系,保证了Java程序的稳定运作。例如,类java.lang.Object类存放在JDK\jre\lib下的rt.jar之中,因此无论是哪个类加载器要加载此类,最终都会委派给启动类加载器进行加载,这边保证了Object类在程序中的各种类加载器中都是同一个类。


4.验证阶段

验证的目的是为了确保Class文件中的字节流包含的信息符合当前虚拟机的要求,而且不会危害虚拟机自身的安全。不同的虚拟机对类验证的实现可能会有所不同,但大致都会完成以下四个阶段的验证:文件格式的验证、元数据的验证、字节码验证和符号引用验证。


5.准备阶段

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配。对于该阶段有以下几点需要注意:

(1) 这时进行内存分配的仅包括类变量(static),而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在Java堆中。

(2) 设置的初始值通常情况下是数据类型默认的零值(如0、0L、null、false等),而不是在Java代码中被显式地赋予的值。


例如:设一个类变量:public static int value = 123;

那么变量value在准备阶段过后的初始值为0,而不是3,因为这时候尚未开始执行任何Java方法,把value赋值为123的putstatic指令是在程序编译后,存放于类构造器<clinit>()方法之中的,所以把value赋值为123的动作将在初始化阶段才会执行。


注意:

(1) 对基本数据类型来说,对于类变量(static)和全局变量,如果不显式地对其赋值而直接使用,则系统会为其赋予默认的零值,而对于局部变量来说,在使用前必须显式地为其赋值,否则编译时不通过。

(2) 对于同时被static和final修饰的常量,必须在声明的时候就为其显式地赋值,否则编译时不通过;而只被final修饰的常量则既可以在声明时显式地为其赋值,也可以在类初始化时显式地为其赋值,总之,在使用前必须为其显式地赋值,系统不会为其赋予默认零值。

(3) 对于引用数据类型reference来说,如数组引用、对象引用等,如果没有对其进行显式地赋值而直接使用,系统都会为其赋予默认的零值,即null。

(4) 如果在数组初始化时没有对数组中的各元素赋值,那么其中的元素将根据对应的数据类型而被赋予默认的零值。

(5) 如果类字段的字段属性表中存在ConstantValue属性,即同时被final和static修饰,那么在准备阶段变量value就会被初始化为ConstValue属性所指定的值。即static final常量在编译期就将其结果放入了调用它的类的常量池中。


6.解析阶段

解析阶段是虚拟机将常量池中的符号引用转化为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法四类符号引用进行,分别对应于常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info、CONSTANT_InterfaceMethodref_info四种常量类型。


解析阶段可能开始于初始化之前,也可能在初始化之后开始,虚拟机会根据需要来判断,到底是在类被加载器加载时就对常量池中的符号引用进行解析(初始化之前),还是等到一个符号引用将要被使用前才去解析它(初始化之后)。


(1) 类或接口解析:判断所要转化成的直接引用是对数组类型,还是普通的对象类型的引用,从而进行不同的解析。

(2) 字段解析:对字段进行解析时,会先在本类中查找是否包含有简单名称和字段描述符都与目标相匹配的字段,如果有,则查找结束;如果没有,则会按照继承关系从上往下递归搜索该类所实现的各个接口和它们的父接口,还没有,则按照继承关系从上往下递归搜索其父类,直至查找结束。


示例:

class Super{  
    public static int m = 11;  
    static{  
        System.out.println("执行了super类静态语句块");  
    }  
}  
  
  
class Father extends Super{  
    public static int m = 33;  
    static{  
        System.out.println("执行了父类静态语句块");  
    }  
}  
  
class Child extends Father{  
    static{  
        System.out.println("执行了子类静态语句块");  
    }  
}  
  
public class StaticTest{  
    public static void main(String[] args){  
        System.out.println(Child.m);  
    }  
}

结果:

执行了super类静态语句块
执行了父类静态语句块
33

如果注释掉Father类中对m定义的那一行,则输出结果如下:

执行了super类静态语句块
11

注意:理论上是按照上述顺序进行搜索解析,但在实际应用中,虚拟机的编译器实现可能要比上述规范要求的更严格一些。如果有一个同名字段同时出现在该类的接口和父类中,或同时在自己或父类的接口中出现,编译器可能会拒绝编译。

(3) 类方法解析:对类方法的解析与对字段解析的搜索步骤差不多,只是多了判断该方法所处的是类还是接口的步骤,而且对类方法的匹配搜索,是先搜索父类,再搜索接口。

(4) 接口方法解析:与类方法解析步骤类似,接口不会有父类,因此,只递归向上搜索父接口就行了。


7.初始化阶段

初始化是类加载机制的最后一步,这个时候才正真开始执行类中定义的JAVA程序代码。在前面准备阶段,类变量已经赋过一次系统要求的初始值,在初始化阶段最重要的事情就是对类变量进行初始化,关注的重点是父子类之间各类资源初始化的顺序。初始化阶段是执行类构造器<clinit>()方法的过程。


<clinit>()方法的执行规则:

(1) <clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句中可以赋值,但是不能访问。

(2) <clinit>()方法与实例构造器<init>()方法(类的构造函数)不同,它不需要显式地调用父类构造器,虚拟机会保证在子类的<clinit>()方法执行之前,父类的<clinit>()方法已经执行完毕。因此,在虚拟机中第一个被执行的<clinit>()方法的类肯定是java.lang.Object。

(3) <clinit>()方法对于类或接口来说并不是必须的,如果一个类中没有静态语句块,也没有对类变量的赋值操作,那么编译器可以不为这个类生成<clinit>()方法。

(4) 接口中不能使用静态语句块,但仍然有类变量(final static)初始化的赋值操作,因此接口与类一样会生成<clinit>()方法。但是接口鱼类不同的是:执行接口的<clinit>()方法不需要先执行父接口的<clinit>()方法,只有当父接口中定义的变量被使用时,父接口才会被初始化。另外,接口的实现类在初始化时也一样不会执行接口的<clinit>()方法。

(5) 虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁和同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。如果在一个类的<clinit>()方法中有耗时很长的操作,那就可能造成多个线程阻塞,在实际应用中这种阻塞往往是很隐蔽的。


示例:

class Father{  
    public static int a = 1;  
    static{  
        a = 2;  
    }  
}  
  
class Child extends Father{  
    public static int b = a;  
}  
  
public class ClinitTest{  
    public static void main(String[] args){  
        System.out.println(Child.b);  
    }  
}  

结果:

2

解析:首先在准备阶段为类变量分配内存并设置类变量初始值,这样A和B均被赋值为默认值0,而后再在调用<clinit>()方法时给它们赋予程序中指定的值。当调用Child.b时,触发Child的<clinit>()方法,根据规则2,在此之前,要先执行完其父类Father的<clinit>()方法,又根据规则1,在执行<clinit>()方法时,需要按static语句或static变量赋值操作等在代码中出现的顺序来执行相关的static语句,因此当触发执行Father的<clinit>()方法时,会先将a赋值为1,再执行static语句块中语句,将a赋值为2,而后再执行Child类的<clinit>()方法,这样便会将b的赋值为2。


8.总结

整个类加载过程中,除了在加载阶段用户应用程序可以自定义类加载器参与之外,其余所有的动作完全由虚拟机主导和控制。到了初始化才开始执行类中定义的Java程序代码(亦及字节码),但这里的执行代码只是个开端,它仅限于<clinit>()方法。类加载过程中主要是将Class文件(类的二进制字节流)加载到虚拟机内存中,真正执行字节码的操作,在加载完成后才真正开始。





Ubuntu 解决WPS缺少宋体,微软雅黑等中文字体 这篇博客解决Ubuntu 18.04 无法使用中文字体的问题 问题描述 阅读详情

相关推荐

【首份】2023年30米分辨率土地利用遥感监测数据

为了恢复和重建我国土地利用变化的现代过程,更好地预测、预报土地利用变化趋势,地球资源数据云以美国陆地卫星Landsat 遥感影像数据作为主信息源,结合Sentinel系列数据,通过人工目视解译和机器学习方法,建立了国家尺度1:10 万比例尺多时期土地利用/土地覆盖遥感监测数据库(CNLUCC)因早期Landsat数据时空覆盖缺失,1972-1977年合成第一期数据,1978-1985年合成第二期数据,1986年起每年度生成一期数据。投影:Albers正轴等面积双标准纬线圆锥投影南标准纬线:25°N。

地球资源数据云的官方博客 3679

JAVA基础--final、static区别以及类加载顺序

  一、JAVA中final 与 static 总结                               final                                               static 修饰类                 该类不可被继承                              只能修饰内部类,该类不需要new,是...

zywyx的专栏 1005

UFS Host Controller工作流程

contentsUFS架构图HCI接口架构传输请求接口(Transfer Request Interface)UFS 主机控制器寄存器接口(host controller Interface)UTP 层数据传输Host Software与Host Controller的交互Host Controller初始化配置与控制CRYPTOCFG 配置过程 该文档描述了UFS Host Controller的主要运作流程以及在开源内核代码hisi平台中的host controller的接口函数设计 文档大部分内容参

Frank_sample的专栏 1万+

Java之类加载机制详解

Java类加载的过程包括加载、验证、准备、解析和初始化五个阶段。每个阶段都有其特定的任务和职责,共同确保了类的正确加载和初始化。加载阶段负责定位和读取类的二进制字节流;验证阶段确保加载的类符合Java虚拟机规范的约束;准备阶段为类的静态变量分配内存并设置默认初始值;解析阶段将常量池中的符号引用替换为直接引用;初始化阶段执行类的初始化代码,包括静态变量的赋值和静态块的执行。了解这些阶段对于调试Java程序、优化性能以及确保程序的安全性都至关重要。

一个老Java开发的自白 1284

AniME框架深度体验:用AI自动生成《修真小说》动画全流程记录

本文详细记录了使用开源多智能体框架AniME,结合其核心动画生成模型AniSora V3,将一段修真小说文本自动转化为风格统一动画视频的全流程实战。文章深入解析了从环境搭建、导演智能体任务分解,到多智能体协作生成分镜、角色、动画及最终合成的每一步操作与挑战,为AI驱动的长视频创作提供了宝贵的实践经验与流程优化思路。

ol789012345的博客 625

字节系,ali系,ks,pdd最新抓包方案

各大厂安卓逆向

qq_38759383的博客 1145

【JAVA基础】JVM之类加载--双亲委派机制

jvm 双亲委派机制

大龄烤红薯的博客 1802

飞牛NAS打造成童年经典游戏机

这篇文章介绍如何使用飞牛NAS搭建经典游戏模拟器。首先需开启Docker并下载RetroArch-web镜像,随后创建容器并设置端口映射。启动后上传游戏ROM文件(如NES格式),在模拟器中加载即可游玩。文章以修改版坦克大战为例,详细说明按键配置方法。同时还提到公网访问需配置DDNS或使用ZeroTier内网穿透。通过这套方案,用户可以在NAS上重温红白机等经典游戏体验。

dgnankai的专栏 885

JAVA核心机制之类加载机制

作为一个Java程序员,了解jvm即Java虚拟机是一件很有必要的事。 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示: 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.cla...

尚拙的博客 606

PCL:读写pcd点云的两种方式

本文介绍了PCL读写点云的两种方式:PCDReader,PCDWriter;loadPCDFile,savePCDFile.

孙悟空 1万+

《用 R 探索医药数据科学》目录(持续更新,已超 250 万字)|订阅前说明

我们重磅推出《用 R 探索医药数据科学》专栏!本文作为专栏【订阅后首读】的核心内容,堪称开启学习之旅的 “入门钥匙”,也是整个专栏最关键的一篇指引文。文中不仅完整呈现了专栏 9 大核心篇章 + 问答板块的详细目录,更囊括了订阅后必知的核心要点 —— 从阅读设备、实操工具的使用建议,到学习路径、更新规则的清晰说明,再到问题反馈、感悟记录的实用方法,一站式帮你摸清专栏框架、找准学习方向。建议各位订阅者务必认真阅读、吃透内容,这能让你后续的学习更高效、少走弯!

MD Code 1万+

java基础之类加载机制(一)

Sun公司设计java语言的目标是让Java程序不必经过修改就可以在各种各样的计算机(包括PC机和工作站)上运行。为了实现这一目标,Sun公司提供了一阵Java虚拟机(Java Virtual Machine,JVM)的机制,其工作原理及流程图为: Java虚拟机是编译和运行Java程序等的各种命令及其运行环境的总称。Java源程序在编译之后生成后缀为“.class”的文件,该

leilu000的专栏 768

【花雕学编程】Arduino FOC 之AS5048A磁编码器模块

您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。在Arduino平台上实现FOC可以提供平滑的运行和高度的扭矩、速度和位置控制,它通过精确控制电机的电流和电压来实现高效率、高精度和低噪声的操作。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、高性能电机控制:FOC是一种高级的电机控制算法,可以精准控制PMSM(永磁同步电机)和BLDC(无刷直流)电机,实现平滑的转速和扭矩输出。

雕爷学编程 1496

JAVA系列之类加载机制详解

自定义类加载器通常有以下四种应用场景:源代码加密,防止源码泄露隔离加载类,采用隔离加载,防止依赖冲突。修改类加载的方式。扩展加载源。

sloveb123的博客 1289

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JAVA面试必看,基础知识之类加载器和加载机制

首先要厘清一个问题,为什么JAVA需要类加载。不明白这个问题,直接说加载机制就是空中楼阁。 JAVA程序员用编程工具编写的代码生成的都是拓展名为.java的文件,显然这个文件是不能直接被计算机识别并运行里面程序的,需要经过Java编译器编译成拓展名为".class"的文件,".class"文件中保存着Java代码经转换后的虚拟机指令。 当需要使用某个类时,JAVA虚拟机将会加载它的".class"文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载。 加载需要加载器

flystarfly的博客 1929

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM篇之类加载机制

刚开始学java时,我们都听过一句话,java跨平台运行,一次编译,处处运行,也就是说,用Java创建的可以执行二进制程序,能够不加改变的运行于多个平台,Java减少了开发和部署的多个平台的成本和时间。 ...

qq_42809478的博客 1070

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JVM之类加载机制

什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 来自:https://baike.baidu.com/item/J

qq_43222167的博客 238

Java虚拟机之类加载机制

3. Shared ClassLoader:加载 Web 应用共享类(对 Tomcat 不可见)。4. Webapp ClassLoader:加载当前 Web 应用的私有类(各应用相互隔离)。掌握 JVM 类加载机制,是排查类冲突、优化应用性能的基石。父加载器无法完成时(搜索范围内无该类),子加载器才尝试加载。:理解类加载器层次、避免类冲突、合理利用自定义加载器。:同一类被不同加载器加载,或不同版本类共存。:加载子类时,父类尚未加载则会先加载父类。解析对象:类、接口、字段、方法、接口方法。

JouJz的博客 695

Java基础知识之类加载机制

一.JVM和类: 运行Java: java 带有main方法的类名 启动JVM,并加载字节码. 当调用java命令来运行某个Java程序时,该命令将会启动一个JVM进程.同一个JVM中的所有线程,变量都处于同一个进程中,共享该JVM的内存区域. 当出现以下情况是,JVM会退出: 1):程序正常执行结束. 2):使用System.exit(0)方法; 3):出现异常时,没有捕获异常. 4):平台...

weixin_41588751的博客 171

JVM专题之类加载机制

一 类加载是什么?什么时候加载类?加载过程是怎么样的? 1.1 什么是类加载 类加载就是指将在硬盘上编译好的class字节码文件,加载到JVM内存中,然后对字节码文件进行链接和初始化的过程。只有加载后的字节码文件才可以被执行引擎解释和执行。 1.2 类加载的时机 JVM并不是启动的时候,就把全部的class字节码加载到内存,而是根据运行时候需要进行加载。比如没有加载到内存的类能够实例化吗?要访问静态类的变量或者方法,如果所在类没有被加载到内存,能访问静态变量和或者静态方法吗? 第一:创建类实例的时候,肯定要

happy19870612's blog 803

JVM 学习之类加载机制

类加载机制 加载:从各个地方加载 class 文件(本地、网络、zip、数据库等)到内存中,在内存中就变为方法区的运行时数据结构,在 Java 堆中生成一个代表这个类的 java.lang.Class 对象,作为对方法区中这些数据的访问入口。 验证:是否满足当前虚拟机要求 文件格式验证,验证字节流是否符合 Class 文件格式的规范,并且能被当前版本的虚拟机处理,该验证的主要目的是保证输入的字节流能正确地解析并存储于方法区之内。经过该阶段的验证后,字节流才会进入内存的方法区中进行存储,后面的三

菜鸟日常 226

JVM基础之类加载

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

2401_84047990的博客 321

jvm之类加载机制

jvm将类的数据从class文件加载到内存中、形成可以被jvm直接使用的Class对象的过程成为类加载机制。

junex的博客 444

struts启动时加载_Java基础之类加载机制

1、概述———————————————————————————————————Java语言的类型可以分为两大类:基本类型和引用类型。基本类型 包括byte,short,int,long,float,double,boolean,char。引用类型包括类,接口,数组类和泛型参数。由于泛型参数会在编译过程中被擦除,因此Java虚拟机实际上只有前三种。在类,接口和数组类中,数组类是由Java...

weixin_39670511的博客 137
上一篇: java学习——java基础(九)之序列化
下一篇: 设计模式学习(三)之单例模式
土豆马铃薯
博客等级 码龄18年 152粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值