java中第一个被执行的方法是_一个java文件被执行的历程

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

Java的编译过程

Java程序从源文件建立到程序运行要通过两大步骤java

f346c57acd68f5a976ba0c52d713a19b.png

一、源文件由编译器编译成字节码(ByteCode)函数

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

一个栗子

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

Public classOneTest{public static voidmain(String[] args){

Person one= newPerson();

one.say();

}

}

Public classPerson{privateString name;public voidsay(){

System.out.println("I `m a Person");

}

}

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

第一步

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

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

二、编译后的字节码文件格式主要分为两部分:常量池和方法字节码。

常量池记录的是代码出现过的常量、类名、成员变量(Person.java中的类Person名、name成员变量)等以及符号引用(类引用、方法引用(OneTest.java中的person.say),成员变量引用等);方法字节码中放的是各个方法的字节码。对象

第二步

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

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

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

b00a867180c7d9d605174ce77c696a13.png

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

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

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

五、执行say方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值