目录
1. Java跨平台相关问题
1.1 什么是跨平台(平台无关性)?
1.2 跨平台(平台无关性)的好处?
1.3 编译原理基础(Java程序编译过程)
1.4Java跨平台的是实现原理?
1.4.1 JVM(Java虚拟机)
1.4.2 Class文件
1.4.3 Java语言规范
1.4.4 总结
2. JDK,JRE,JVM三者的区别和联系?
3. xxx.java 文件和 xxx.class 文件的区别?
前言:
我们初学者在刚刚接触到Java这门语言的时候,大概率会听说Java是一个跨平台语言,移植性好等一系列官方词语。同时,我们在学习Java的第一件事情就是下载JDK,也于此引出了JRE,JVM等一系列词语,还有就是我们可能听说过的"源码","字节码"等字眼,它们都是什么意思?对于大多数初学者来说,我们学习Java可能就是直接从编写代码入手的,对于上面的这些问题也许并不是特别的明白。小编在自己上网搜索的时候,发现许多人并没有将它们放在一起统一讲解,所以今天小编就来简单做整理一下整理,用大白话来给各位小伙伴们说一说文章标题中的一些问题和解答。同时也是方便日后自己复习观看。
1. Java跨平台相关问题
1.1 什么是跨平台(平台无关性)?
跨平台的意思就是说Java代码的运行可以不受平台的约束,只需要将代码进行一次编译,就可以在多种平台上运行。即一次编译,到处执行(Write Once,Run Anywhere)。
1.2 跨平台(平台无关性)的好处?
跨平台无论是对自身发展或者是开发,都是极为便利的。因为具有跨平台性,所以Java程序可以运行在各种各样的设备上,尤其是一些嵌入式设备,如打印机,扫描仪,传真机等。5G的到来,也使得更多的终端接入到了网络。
另一方面,对于Java开发者来说,跨平台特性减少了从开发到部署在多个平台的成本和时间。真正的做到了一次编译,到处运行。
1.3 编译原理基础(Java程序编译过程)
众所周知,在计算机的世界里,只认识0和1,所以,任何一个可以被计算机真正执行的文件,其实都是由0和1组成的二进制文件。
而我们平常学习的Java,Python,C,C++ 等都属于高级语言,而非二进制语言。所以计算机是无法执行我们编写的文件的,因此我们就需要将我们自己编写的代码文件翻译成计算机能识别并且可以执行的二进制文件,翻译这个过程就是我们常说的编译,而做翻译这件事的工具,就是编译器。
以Java为例,Java文件想要编译成二进制文件,需要经过两步编译,即前端编译和后端编译。(注意!!!这里的前端编译和后端编译不是我们开发中所理解前端代码和后端代码,可以先简单地理解为两个不一样的步骤。)
前端编译:前端编译主要指和源代码有关但和目标机器无关的部分。Java中,我们所熟知的 javac 编译器就是前端编译器。除此之外,我们使用的很多开发软件如 IDEA,Eclipse 都内置了前端编译器,前端编译其的功能就是将我们的所写的 .java 文件编译成 .class 字节码文件。
后端编译: 后端编译则是将前端编译器编译之后生成的 .class 字节码文件再次编译成计算机所能识别并执行的二进制文件。Java中,后端编译这一操作就是由Java虚拟机来完成的。
如下图所示,我随便打开一个电脑上的Java项目,找到存放源代码的文件夹,点开之后就可以发现我们编写的代码都是以 .java 结尾的,这就是Java文件。在经过 javac 前端编译其编译后,就从xxx.java 文件变成了 xxx.class 字节码文件对象,再由JVM(Java虚拟机)后端编译转变成二进制文件由机器去执行。
1.4Java跨平台的是实现原理?
对于Java跨平台特性的实现,支持者是分布在整个Java是体制中的,其中扮演重要角色的有 JVM(Java虚拟机)、Class文件、Java语言规范等......我们依次对他们进行讲解。
1.4.1 JVM(Java虚拟机)
我们知道,对于不同的操作系统和硬件,最重要的一点区别就是指令不同。举个例子,比如执行 a + b 操作,Windows 操作系统对应的二进制指令如果为 11101100,那么 Linux 操作系统可能就变成了 10000010。因此,想要实现跨平台,最关键的一点就是根据不同的硬件和平台去生成对应的二进制文件指令。而这一工作,就是由Java虚拟机来完成的。虽然Java语言是跨平台的,但是Java虚拟机却是和平台有关的。
如下图所示,不同的操作系统要装备对应的Java虚拟机。
如下图,当我们编写代码后,不同平台的Java虚拟机就会将我们编写的代码编译成对应平台或计算机可以识别执行的二进制文件。所以说,Java虚拟机实际上充当了Java程序和其他各种平台及硬件之间的交互桥梁,因而实现了跨平台特性。
1.4.2 Class文件
虽然Java有多种不同的虚拟机版本,但是它们存储文件的格式都有是统一的。不管是 Windows系统,Linux系统,亦或者是Mac,它们存储的文件格式都是 .class 文件,Java虚拟机只和 .class 文件进行交互,将 .class 文件编译成二进制文件,不能将我们写的 .java 文件编译成二进制文件。
在最开始,我说到了一句 "一次编译,到处执行(Write Once,Run Anywhere)",说的就是我们的 Class 文件对象,前端编译器只需要一次编译将我们的 .java 文件编译成 .class 文件后,如果我们想换一个平台去执行我们的代码,就不需要再次进行前端编译。举个例子,现在我们在 windows 系统下执行改过了代码,我们再去 linux 系统下执行,就不需要我们的 .java 文件了,linux 系统的Java虚拟机可以直接装载识别并直接后端编译 windows 系统下已经前端编译过生成的 .class 文件,这就是一次编译,到处运行的真正含义。
1.4.3 Java语言规范
已经有了统一的 Class 文件,以及在不同平台上可以把 Class 文件翻译成二进制文件的Java虚拟机,Java就可以彻底实现跨平台了吗?
其实并不是的,Java语言在跨平台方面也做出了一些努力,这些努力就被定义在Java语言规范之中。
例如,Java中基本数据类型的值域和行为都是由自己定义的。而在C/C++中,基本数据类型是由它的占位宽度决定的,占位宽度则由所在的平台来决定,在不同的平台,同一个C++程序在编译后可能会出现不同的行为。
举个简单的例子:Java中的 int 类型占四个字节,这是固定的,无论在哪个平台都是占用四个字节。而在C++中却不是固定的,在16位计算机,int 类型可能占用两个字节;在32位计算机上,可能为4个字节;在64位计算机上,int 类型可能占用8个字节。(注意!!!这里说的是可能哦)
总而言之,通过保证基本数据类型在所有平台的一致性,Java语言为跨平台特性提供了强有力的支撑!
1.4.4 总结
(1)Java虚拟机:通过Java虚拟机将 Class 文件编译转化成对应平台的二进制文件;
(2)Class 文件:所有Java文件都由javac编译器编译成class文件,规范文件一致性;
(3)Java语言规范:规定了Java语言中基本数据类型的取值范围和行为;
2. JDK,JRE,JVM三者的区别和联系?
因为网上有很多文章都有说过,所以小编在这里简要概括,直接总结干货重点。
JDK>JRE>JVM,即jvm是jre的子集,jre是jdk的子集,三者是嵌套关系。
- JDK全称 Java development kit,译为Java开发工具; 主要包含javac编译器,jvm虚拟机编译器,Java核心类库,调试器和监控器等开发工具,头文件和开发库,示例代码以及API文档等。
- JRE全称 Java runtime environment,译为Java运行环境; 主要包含jvm虚拟机,核心类库,Jav核心包,AWT和Swing用户界面库,其它扩展支持文件。
- JVM全称 Java virtual machine,译为 Java 虚拟机;主要就是用来编译 javac 编译器生成的 class 文件,还含有类加载器ClassLoader,执行引擎,本地接口,本地方法库,垃圾回收器等
3. xxx.java 文件和 xxx.class 文件的区别?
其实看到这里,想必不用多说各位小伙伴也已经能够明白这弱者的区别了。
xxx.java 文件就是存储我们编写的程序代码文件,以 .java 后缀,我们在本地文件夹中打开就可以看到。
xxx.class 文件则是我们编写的 Java 文件经过 javac 编译器前端编译后生成的 .class 字节码文件,字节码文件需要进一步经过Java虚拟机编译生成二进制文件才可以被计算机识别运行,此外编译后的字节码文件可以被不同平台的Java虚拟机所识别并编译,这是Java能够实现跨平台的一大支撑点。