实际上Test继承了自身,从二进制源码看,因此会有如此的error,并对数据进行校验、准备、解析和初始化。最终形成可以被虚拟机直接使用的Java类型。这就是虚拟机的类加载机制。虚拟机(jvm把描述类的数据从class文件或其他形式数据加载到内存。类加载的生命周期包括:加载、链接(验证、准备和解析)初始化、使用、卸载。
传送给main所在类一个字符串数组,Jvm通过调用某个类指定类的main方法启动。然后把hellosmurfs,javaTesthellosmurfs,welcomtojvm.这样jvm通过加载Test.class文件。welcomtojvm.作为5个长度的字符串数据传送给Test类的main方法去执行。通过链接步骤,Jvm加载Test.class文件后。把Test.class生成的class对象链接到对应的类型,然后进行初始化操作,所有都正确完成之后,才构造了一个完整的Test类对象,进而才干正确的执行方法。
并且用这个二进制形式构造一个代表该类的class对象的过程叫装载(个动词,⑴class文件装载:寻找一个具有特定名称的类的二进制形式。指过程)装载是通过ClassLoad和其子类实现的ClassLoad不同子类可以实现不同的装载战略,包括class文件加密(特殊位置加载(网络加载)等都是通过classload来完成的类加载后的信息存在于jvm方法区域内,这个区域缓存这类的信息,并且这个区域基本是不进行垃圾回收的因此如果没有进行classload加载对象的清空,新的class文件替代旧class文件后,类信息并没有被替换。
通过类的全限定名来获取定义此类的二进制流;将这个二进制流所代表的静态存储结构转化为方法区(jvm内存)运行时数据,作为方法区这些数据的入口。3Java堆(jvm内存)中生成一个代表类的java.lang.Class对象。会抛出LinkageError异常的以下3个子类示例:如果类的装载出现错误。lClassCircularityError因一个类或接口是自身的超类而不能被加载,lClassFormatError所要求的编译后的类的二进制数据是损坏的,lNoClassDefFoundError找不到类的定义。
不包含Test.java目录里执行javaTest后出现NoClassDefFoundError,首先编写个Test.java文件l接下来看看ClassFormatError错误。
把其中的println改成printl后,修改编译后Test.class文件。再通过javaTest执行。这种错误是不会存在但是当大型项目,l最后来看ClassCircularityError错误。正常清空下。需要很多人提交代码时就可能会出现问题。Test和ATest继承与首先编写2个类A,删除A.class把Test.class改名维护起来为Test.class.a再编写Test和A这次A继承自Test编译后产生Test.class和A.class2个2进制文件。然后把先前改名的Test.class.a该回Test.class再执行javaTest后这次编译后删除Test.class保存A.class文件。