Java类及对象的创建过程(代码以及JVM底层分析)(8/16)
预先了解知识:
Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码)这个编译不是生成特定平台的机器码,而是生成一种与平台无关的字节码,就能在不同平台的JVM上运行(在UNIX用UNIX的JVM,在linux上用linux的JVM,在windows上用windows的JVM) 。
编译(静态加载类)
当编辑并运行一个Java程序时,需要同时涉及到这四种方面。使用文字编辑软件(例如记事本、写字板、UltraEdit等)或集成开发环境(Eclipse、MyEclipse等)在Java源文件中定义不同的类 ,通过调用类(这些类实现了Java API)中的方法(静态方法或是构造方法)来访问资源系统,把源文件编译生成一种二进制中间码(字节码),存储在class文件中
加载(类的装载)
JVM内存中,在class文件被加载时,它们会接接受验证,以确保它们没被破坏,并且不包含不良代码(安全防范措施之一),执行编译产生的字节码,就会产生Class对象,一旦某个Class类对象被载入内存,它就被用来创建这个类的所有对象,对象中实现的方法来满足程序的Java API调用 。
链接
链接包含三个阶段:检验,准备和解析。检验检查被装载的主类的符号和语义(验证字节码)。
准备则创建类或接口的静态域以及把这些域初始化为标准的默认值(为静态域分配空间)。
解析负责检查主类对其它类或接口的符号引用(将类中的创建的对其他类的引用从符号引用解析为直接引用),在这一步它是可选的
初始化
类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法(构造器隐式地是静态的)的执行。
实例分析:
所有类都是在第一次使用时,动态加载到JVM中,当程序创建第一个对类的静态成员的引用时,Java虚拟机(JVM)将使用被称为“类加载器“的子系统就会加载这个类,因此,java程序在运行之前完全被加载。
分析代码的编译及执行过程:(引用的另一个博主的案例https://www.cnblogs.com/lishun1005/p/6019678.html)
开始试图执行类HelloApp的main方法,发现该类并没有被装载,也就是说虚拟机当前不包含该类的二进制代码,于是虚拟机使用ClassLoader试图寻找这样的二进制字节码.class文件。如果这个进程失败,则抛出一个异常。类被装载后同时在main方法被调用之前,
必须对类HelloApp与其它类型进行链接然后初始化。
链接包含三个阶段:检验,准备和解析。
检验检查被装载的主类的符号和语义(验证字节码)。
准备则创建类或接口的静态域以及把这些域初始化为标准的默认值(为静态域分配空间)。
解析负责检查主类对其它类或接口的符号引用(将类中的创建的对其他类的引用从符号引用解析为直接引用),在这一步它是可选的。类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法(构造器隐式地是静态的)的执行。
参考书籍:《java编程思想》: