Java跨平台的原理是什么?JDK,JRE,JVM三者的作用和区别?xxx.java和xxx.class有什么区别?看这一篇就够了

news2024/9/22 17:34:23

目录

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能够实现跨平台的一大支撑点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1934397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

是德keysight N9020B(原Agilent) N9020A信号频谱分析仪

Agilent N9020B N9020B信号分析仪手持信号分析仪 N9020B MXA 信号分析仪,10 Hz 至 26.5 GHz 主要特性和功能快速适应无线器件不断演进的测试要求通过硬件加速功率测量缩短测试时间,显示更新速率快,并且具有游标峰值搜索和快速扫描功能X 系列…

el-select选择器修改背景颜色

<!--* FilePath: topSearch.vue* Author: 是十九呐* Date: 2024-07-18 09:46:03* LastEditTime: 2024-07-18 10:42:03 --> <template><div class"topSearch-container"><div class"search-item"><div class"item-name&quo…

ROS2从入门到精通2-3:机器人3D物理仿真Gazebo与案例分析

目录 0 专栏介绍1 什么是Gazebo&#xff1f;2 Gazebo架构2.1 Gazebo前后端2.2 Gazebo文件格式2.3 Gazebo环境变量 3 Gazebo安装与基本界面4 搭建自己的地图4.1 编辑地图4.2 保存地图4.3 加载地图 5 常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底…

Java案例斗地主游戏

目录 一案例要求&#xff1a; 二具体代码&#xff1a; 一案例要求&#xff1a; &#xff08;由于暂时没有学到通信知识&#xff0c;所以只会发牌&#xff0c;不会设计打牌游戏&#xff09; 二具体代码&#xff1a; Ⅰ&#xff1a;主函数 package three;public class test {…

ExoPlayer架构详解与源码分析(15)——Renderer

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

SpringData JPA Mongodb 查询部分字段

JPA 网上用的好像不多&#xff0c;找了好多材料以后最终找了这个可行的方案&#xff1a; Query(fields "{tender_id:1,_id:0}")List<MGPltTender> findByTenderIdIsNotNull(PageRequest pageRequest); 调用&#xff1a; Sort sort Sort.by(popularType.getC…

android串口通讯(JAVA)

一、app目录下添加 implementation io.github.xmaihh:serialport:2.1.1 1) 点击Sync Now更新依赖 2) AndroidManifest.xml文件添加读取设备信息权限 <uses-permission android:name"android.permission.READ_PHONE_STATE" /> 二、 使用 1) 创建MySerialPo…

实现了一个心理测试的小程序,微信小程序学习使用问题总结

1. 如何在跳转页面中传递参数 &#xff0c;在 onLoad 方法中通过 options 接收 2. radio 如何获取选中的值&#xff1f; bindchange 方法 参数e, e.detail.value 。 如果想要获取其他属性&#xff0c;使用data-xx 指定&#xff0c;然后 e.target.dataset.xx 获取。 3. 不刷…

Notepad++换安装路径之后,右键打开方式报错:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。的处理方法

把Notepad添加到右键打开方式&#xff0c;可以参考下面的3篇文章添加&#xff1a; https://blog.csdn.net/xiaoerbuyu1233/article/details/88287747 https://blog.csdn.net/qq_44000337/article/details/120277317 https://www.cnblogs.com/zhrngM/p/12899026.html 这里主要是…

filebeat,kafka,clickhouse,ClickVisual搭建轻量级日志平台

springboot集成链路追踪 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/> <!-- lookup parent from…

申请https证书的具体流程

申请HTTPS证书的具体流程通常涉及以下步骤&#xff0c;不过请注意&#xff0c;具体细节可能因不同的证书颁发机构&#xff08;CA&#xff09;而有所差异&#xff1a; 1、确定证书类型&#xff1a; 证书类型&#xff1a;根据需求选择合适的SSL证书类型。常见的有DV&#xff08;…

Vue 组件插槽 slot 简单例子

https://andi.cn/page/621582.html

synergy配置

今天介绍一个电脑同步软件synergy。 我们开发时一般会用两套设备&#xff0c;如果使用两套键盘操作起来会很麻烦&#xff0c;这个软件就是解决这个问题&#xff0c;可以使用一套键盘同时操作两台电脑&#xff0c;另一台作为客户端被控制。 安装 在两台电脑上各自下载安装syne…

来参与“向日葵杯”全国教育仿真技术大赛~

可点击进行了解&#xff1a;“向日葵杯”全国教育仿真技术大赛 (sunmooc.cn) 本次大赛共分为四个赛道&#xff1a;自主命题赛道、教育知识图谱设计赛道、FPGA硬件扑克牌对抗赛道、EasyAR元宇宙空间设计赛道。 参赛对象 &#xff1a; 具有正式学籍的在校研究生&#xff0c;本科…

使用Python实现高效的图像处理:基于OpenCV的实战指南

目录 引言 准备工作 安装Python与OpenCV 导入必要的库 基本图像处理操作 读取与显示图像 转换图像颜色空间 图像变换 图像滤波 实战案例&#xff1a;边缘检测 引言 在现代科技快速发展的今天&#xff0c;图像处理已成为众多领域不可或缺的一部分&#xff0c;包括计算…

QT5:简单显示百度页面

目录 前言 一、环境 二、实现过程 1.引入模块 2.环境构建 三、代码示例 总结 参考博客 前言 使用qt5 QT WebEngine 模块实现在Designer 上展示百度页面。 一、环境 qt版本&#xff1a;5.12.7 windows 11 下的 Qt Designer &#xff08;已搭建&#xff09; 编译器&a…

Vue 3项目安装Element-Plus

Element Plus 是一个基于 Vue 3 的现代前端UI框架&#xff0c;它旨在提升开发体验&#xff0c;并为开发者提供高效、优雅的组件。如果你正在使用 Vue 3 进行项目开发&#xff0c;那么安装和集成 Element Plus 是一个不错的选择。在本文中&#xff0c;博主将详细介绍如何在 Vue …

水域救援装备的详细简介_鼎跃安全

水域救援行动需要救援人员配备全面、专业的装备&#xff0c;以应对各种复杂的水域环境和救援任务。水域救援套装应运而生&#xff0c;它集合了水域救援所需的各类关键装备&#xff0c;为救援人员提供全方位的保护和辅助&#xff0c;确保数援行动的高效与安全。 水域救援头盔&am…

2024717-VSCode-1.19.1-部署gcc13-C++23-win10-22h2

2024717-VSCode-1.19.1-部署gcc13-C++23-win10-22h2 一、软件环境 标签:C++ VSCode mingw gcc13分栏:C++操作系统:Windows10 x64 22h2二、操作步骤 1. 下载安装VScode 1.1官网 打开官网【https://code.visualstudio.com/Download】,选择【System Installer】【x64】,按…

19-2 LLM之野望 2 - LLM给到Quora面临的困境

Quora 有一个简单的前提&#xff1a;它是一个分享知识和专业知识的地方&#xff0c;好奇的人可以就任何可以想象到的话题提出问题&#xff0c;并从平台博学的社区获得深思熟虑的、见识广博的答案。 想想雅虎答案 (Yahoo Answers)&#xff0c;它适用于技术员工和格拉德威尔式的…