Java代码从编写到运行的过程。
编译器将源文件(.java)编译为字节码文件(.class)
- 编译一个类时,先检查类所依赖的类是否被编译,没有则先编译依赖类,然后引用;否则直接引用。若找不到依赖的.java或.class,编译器就报
con't find symbol
错误。
- 编译一个类时,先检查类所依赖的类是否被编译,没有则先编译依赖类,然后引用;否则直接引用。若找不到依赖的.java或.class,编译器就报
运行
- 类的加载:jvm只在类第一次被使用时加载一次,后期使用不用再加载
- 类的执行:通过类的实例找到类的方法和属性
1 | public abstract class Main { |
- 完整过程:
- 执行
java -c Main.java
,编译为Main.class
- 执行
java Main
,运行程序。系统启动一个jvm进程,jvm进程从classpath
路径找到Main.class
文件,将Main
的类信息加载到运行时数据区的方法区内。(类的加载) - 然后找到
Main
里的主函数入口,开始执行main函数。 - 执行main函数第一行
Dog d = new Dog("haShi");
,jvm就会创建一个Dog
对象,发现方法区没有Dog
类信息,就将Dog
类加载到方法区。 - 加载完
Dog
类之后,jvm就在堆区创建一个Dog
实例分配内存,然后调用构造函数初始化实例。这个实例持有指向方法区的类信息(其中包含方法表,java动态绑定的底层实现)的引用。 - 当执行
dog.displayName()
时,jvm根据dog
引用找到实例对象,然后根据实例对象持有的方法区中类信息里的方法表,获得displayName()
函数的字节码位置。 - 最后运行
displayName()
。
- 执行
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!