强哥带你零基础学java-04java虚拟机

    技术2022-07-21  85

    public class Hello { public static void main(String[] arr){ System.out.print("跟着强哥学习编程"); } }

    这是上一篇博客的例子,本章,将对此例的细节进行讲解。

    上面的例子是一个很简单的java程序,它想要被运行,首先要被编译,编译的目的是将java源代码转化为CPU能识别的二进制指令。想要编译java源代码,需要用javac.exe,在cmd中,通过javac Hello.java,即可实现编译。

    编译好了之后,会生成Hello.class 这时就要让java.exe 帮忙把Hello.class 提交给CPU执行。

    以上是上一篇的主要内容。

    Hello.class 中的指令并不是CPU能识别的二进制指令

    在上一篇中,我说Hello.class中的指令是CPU能识别的二进制指令,这其实是不对的。那么问题来了,既然Hello.class中的指令不是CPU能识别的二进制指令,那么CPU是如何执行Hello.class的呢?

    要想回答这个问题,那么我们必须得清楚在cmd中执行 java Hello时到底发生了什么事。

    Hello是Hello.class的缩写,java.exe 在开始执行的时候,首先会启动一个java虚拟机,这个java虚拟机本质上就是一个C++的程序,它的作用是就帮忙把class文件中的指令转化为CPU能识别的二进制指令。所以现在你应该明白了吧,在我们看不到的地方,java虚拟机会帮助我们把class文件中的指令转化为CPU能识别的二进制指令。对于java程序员来说,你只需要按照java的规则来编写程序就是,根本就不需要考虑cpu的二进制指令应该要怎么写,java虚拟机会自动帮你将class文件中的指令转化为CPU的指令。

    java语言为什么要弄个java虚拟机?

    java的源代码要先编译为class,然后java虚拟机将class中的指令转化为具体的CPU指令。

    有些初学的朋友,可能会想,为什么不直接将java源代码编译为CPU指令呢?对于这个问题,因为你是初学,有些深层次的问题可能想不到。比如C语言,C语言写的程序,在编译时,就是直接将源代码编译为具体的CPU指令。它的优点就是,运行快速,因为它没有虚拟机这个转化过程。但是它的缺点是什么呢?C语言的最大缺点就是兼容性差,什么是兼容性差?先看下方图

    假设有一个程序叫做C语言A,最开始时,它是针对windows系统编写的,过了半年后,想要让C语言A在Linux系统上运行,那么就必须得再次修改C语言A,让它符合Linux的规则,才可以让其在Linux上运行。需要注意的是,这个修改过程是非常的繁琐和麻烦,需要花费大量的精力和时间。这也是为什么我说它兼容性差的原因。

    这时,再来看下方图

    假如你用java语言写了一个程序java语言A,最初它是运行在windows系统上,这时你想要让它运行在Linux上,你的源代码不需要做任何修改,就可以直接运行在LInux上。从这一点看,是不是就发现java确实比C语言要好的多,但是java语言的运行速度,会C语言慢一些,因为java程序有一个java虚拟机,java虚拟机在将class转化为CPU指令时,会耗费一些时间。

    java语言最大的好处就是写出来的程序,可以不修改源代码,即可运行在各大操作系统之上。这就是书上说的:一次编译,到处运行。

    强哥带你零基础学java-05 java中的类

    Processed: 0.009, SQL: 9