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编程思想》:

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值