学习java以来,都是以语法,类库入手,最基本的也是最基础的java编译过程往往被我遗忘,先解释一下学习java第一课时,都听到过的一句话,“java是半解释语言”。什么是半解释语言。

Java的编译过程

Java程序从源文件创建到程序运行要经过两大步骤

1、源文件由编译器编译成字节码(ByteCode)

2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-interpreted" language)。

一个栗子

下面我们通过一个简单的 OneTest.java,来看一下一个java文件从编译到运行的历程。

Public class OneTest{
public static void main(String[] args){
Person one = new Person();
one.say();
}
}
Public class Person{
private String name; public void say(){
System.out.println("I `m a Person");
}
}

这里是两个java文件,分别是OneTest.java,Person.java

第一步

首先是编译阶段,由JVM编译器,将OneTest.java文件进行编译,得到字节码文件(OneTest.class),这里我们发现,OneTest.java中依赖了Person对象,也就是需要Person.java文件,编译器便会检索Persion.java是否被编译(是否存在Person.class),若不存在,则先编译Person.java,java编译一个类时,如果这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类,然后引用。

1、如果java编译器在指定的目录下找不到该类所依赖的类的 .class文件或者 .java源文件,就会报 “Cant found sysbol”的异常错误。

2、编译后的字节码文件格式主要分为两部分:常量池和方法字节码。
常量池记录的是代码出现过的常量、类名、成员变量(Person.java中的类Person名、name成员变量)等以及符号引用(类引用、方法引用(OneTest.java中的person.say),成员变量引用等);方法字节码中放的是各个方法的字节码。

第二步

然后进行解释运行阶段,这里运行阶段分为两步:类的加载和类的执行

JVM主要在程序第一次主动使用类的时候,才会去加载该类。也就是说,JVM并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。

1、OneTest类的加载:在类路径下找到编译好的 java 程序中;得到 OneTest.class 字节码文件后,系统就会启动一个 JVM 进程,JVM进程从classpath路径下找到一个名为OneTest.class的二进制文件,将OneTest.class文件中的类信息加载到运行时数据区的方法区中,这一过程叫做类的加载。(只有类信息在方法区中,才能创建对象,使用类中的成员变量)关于类的加载器

2、运行OneTest.java中的main方法:main函数的第一条命令是Persion  person = new Person();就是让JVM创建一个Person对象,但是这时候方法区中没有Person类的信息,所以JVM马上加载Person类,把Person类的类型信息放到方法区中。

3、加载完Person类之后,Java虚拟机做的第一件事情就是在堆区中为一个新的Person实例分配内存, 然后调用构造函数初始化Person实例,这个Person实例持有着指向方法区的Person类的类型信息(其中包含有方法表,java动态绑定的底层实现)的引用

4、当使用person.say()的时候,JVM根据person引用找到Person对象,然后根据Person对象持有的引用定位到方法区中Person类的类型信息的方法表,获得say()函数的字节码的地址。

5、执行say方法。

一个java文件被执行的历程的更多相关文章

  1. 一个 java 文件的执行过程详解

    平时我们都使用 idea.eclipse 等软件来编写代码,在编写完之后直接点击运行就可以启动程序了,那么这个过程是怎么样的? 总体过程 我们编写的 java 文件在由编译器编译后会生成对应的 cla ...

  2. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

  3. Java-Runoob-高级教程-实例-环境设置实例:1.Java 实例 – 如何编译一个Java 文件?

    ylbtech-Java-Runoob-高级教程-实例-环境设置实例:1.Java 实例 – 如何编译一个Java 文件? 1.返回顶部 1. Java 实例 - 如何编译 Java 文件  Java ...

  4. 一个Java文件至多包含一个公共类

    编写一个java源文件时,该源文件又称为编译单元.一个java文件可以包含多个类,但至多包含一个公共类,作为编译时该java文件的公用接口,公共类的名字和源文件的名字要相同,源文件名字的格式为[公共类 ...

  5. Java基础-一个java文件多个类的问题

    一个.java文件当然可以包括多个类.但这些类有一个特殊的类与其它的不同,,这个类是带public 属性的类.一个.java类文件中仅有一个public属性的类.而且这个类与文件名相同.

  6. 一个java文件编译之后会产生多个class文件

    如图所示:如果编译后一个java文件中类有内部类的话,就会编译产生多个类

  7. 一个.java文件中是否可以有多个类

    前段时间,有个同事问到我这个问题:一个.java文件中是否可以有多个类? 答案:可以有多个类,但最多只能有一个被public修饰的class. 且若这个.java文件中有一个public类型的clas ...

  8. 第一个Java文件

    HelloWorld 1.新建一个文件夹,用来存放java文件的 2.用subline来编辑第一个Java文件 要注意的是java的文件名为.java 我们自定义的文件名是Hello 3.编写第一个j ...

  9. Eclipse 想运行一个java文件,结果却运行了另外一个

    参考: Eclipse 想运行一个java文件,结果却运行了另外一个_小鹰信息技术服务部-CSDN博客_eclipse怎么运行另一个

随机推荐

  1. kali 系列学习12-使用Wifite破解无线网络

    一些破解无线网络程序是使用Aircrack-ng工具集,并添加了一个图形界面或使用文本菜单的形式来破解无线网络.这使得用户使用它们更容易,而且不需要记住任何命令.本节将介绍使用命令行工具Wifite, ...

  2. php在线预览pdf文件

    话不多说,直接上代码 <?php public function read_pdf($file) { if(strtolower(substr(strrchr($file,'.'),1)) != ...

  3. 「LOJ 3153」 「JOI Open 2019」三级跳

    题面 LOJ 3153 solution 对于任意一对\(A,B\),若区间\([A,B]\)中存在一个数权值大于\(A\)或\(B\),则用这个数来替代\(A\)或\(B\)显然更优. 故只需要考虑 ...

  4. Python学习系列之列表(十一)

    一.为什么需要列表 变量可以存储一个元素,而列表是一个"大容器"可以存储N多个元素,程序可以方便地对这些数据进行整体操作 列表相当于其它语言中的数组 二.列表的创建1.列表需要使用 ...

  5. web文件上传漏洞

    什么是文件上传漏洞? 指利用系统的对文件上传部分的控制不足或处理缺陷,上传可执行的动态脚本文件/webShell进行攻击行为. 原因 对于上传文件的后缀名(扩展名)没有做较为严格的限制 对于上传文件的 ...

  6. 蓝桥杯——快速排序(2018JavaB组第5题9分)

    快速排序(18JavaB5,9') 以下代码可以从数组a[]中找出第k小的元素. 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的. 请仔细阅读分析源码,填写划线部分缺失的内容. impo ...

  7. 项目、地铁/公交、游戏签到、项目上线后发现新bug该怎么处理

    项目:1.提前分配好业务(每个人该干什么 )2.提前召开会议3.提前挑好人4.准备项目思维导图5.提前审阅项目6.为确保项目按期交付 把控好时间7.给员工提前打好招呼 (提醒加班)8.建立好安全机制9 ...

  8. 【MySQL/C#/.NET】VS2010报错--“.Net Framework Data Provider。可能没有安装。”

    前言 公司行业是金融软件,之前用的都是Oracle数据库.Oracle数据库用一个词来形容:大而全.MySQL的话,可能是因为开源.便宜,现在越来越主流. 我们也支持MySQL数据库,不过平时不用.最 ...

  9. JQuery 和 Bootstrap

    https://jquery.com/ 1. JQuery  的基础语法 $(select).action() 2. 查找标签 基本选择器 class选择器: $(".className&q ...

  10. vue----(组件)子组件和父组件

    1.组件的定义 1.定义组件并引用 2.父组件向子组件传值 3.子组件向父组件传值 什么是组件 1.Html中有组件,是一段可以被复用的结构代码 2.Css中有组件,是一段可以被复用的样式 3.Js中 ...