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

目录

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.rhkb.cn/news/379284.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Object和?

Class<?> 和 Class<Object> 是不同的。 Class<?> 是一个通配符类型&#xff0c;表示未知的具体类型&#xff0c;它可以匹配任意类型。例如&#xff0c;Class<?> 可以表示 String.class、Integer.class 或者任何其他类的 Class 对象。 Class<Ob…

仅两家!云原生向量数据库 PieCloudVector 全项通过信通院「可信数据库」评测

7月16日&#xff0c;2024 可信数据库发展大会在北京隆重举行。大会以“自主、创新、引领”为主题&#xff0c;近百位数据库领域的专家、学者齐聚一堂&#xff0c;带来高质量的数据库技术洞察与实战经验。 本次可信数据库发展大会中&#xff0c;中国信通院正式公布 2024 年上半年…

全国产服务器主板:搭载飞腾FT2000+/64处理器的高性能加固服务器

近期很多朋友咨询全国产化的服务器主板。搭载的是飞腾FT-2000/64的全国产化服务器主板。他的主要特点是&#xff1a;①丰富的PCIe、千兆以太网、SATA接口&#xff0c;可用作数据处理、存储、通信服务器&#xff1b;②​​​​​​​板载独立显示芯片&#xff0c;对外HDMI/VGA/L…

c# .net core中间件,生命周期

某些模块和处理程序具有存储在 Web.config 中的配置选项。但是在 ASP.NET Core 中&#xff0c;使用新配置模型取代了 Web.config。 HTTP 模块和处理程序如何工作 官网地址&#xff1a; 将 HTTP 处理程序和模块迁移到 ASP.NET Core 中间件 | Microsoft Learn 处理程序是&#xf…

经典神经网络(14)T5模型原理详解及其微调(文本摘要)

经典神经网络(14)T5模型原理详解及其微调(文本摘要) 2018 年&#xff0c;谷歌发布基于双向 Transformer 的大规模预训练语言模型 BERT&#xff0c;而后一系列基于 BERT 的研究工作如春笋般涌现&#xff0c;预训练模型也成为了业内解决 NLP 问题的标配。 2019年&#xff0c;谷歌…

node解析Excel中的考试题并实现在线做题功能

1、背景 最近公司安排业务技能考试&#xff0c;下发excel文件的题库&#xff0c;在excel里查看并不是很方便&#xff0c;就想着像学习驾考题目一样&#xff0c;一边看一边做&#xff0c;做完之后可以查看正确答案。 2、开始分析需求 题目格式如下图 需求比较简单&#xff0c;…

阿里布达插画:成都亚恒丰创教育科技有限公司

阿里布达插画&#xff1a;梦幻与现实交织的绮丽画卷 在浩瀚的艺术长河中&#xff0c;总有一些作品以其独特的魅力&#xff0c;跨越时空的界限&#xff0c;触动着每一个观者的心灵。阿里布达插画&#xff0c;便是这样一股不可忽视的艺术清流&#xff0c;它以细腻的情感描绘、奇…

c++ Program to print pyramid pattern (打印金字塔图案的程序)

编写程序打印由星星组成的金字塔图案 例子 &#xff1a; 输入&#xff1a;n 6输出&#xff1a; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 我们强烈建…

完美的用户体验:如何设计一个直观和有效的网站导航?

APP的顶部导航栏对我们来说很熟悉。导航栏是UI设计中不可或缺的一部分&#xff0c;几乎每个页面都使用导航栏。虽然导航栏看起来很简单&#xff0c;不需要太多精力&#xff0c;但是设计一个与产品需求和客户目标高度匹配的导航栏并不是那么容易的。导航栏的设计标准有很多细节需…

Java语言程序设计基础篇_编程练习题**14.29(游戏:豆机)

第十四章第二十九题 **14.29 (游戏&#xff1a;豆机) 请写一个程序&#xff0c;显示编程练习题 7.21 中介绍的豆机&#xff0c;如图 14-52c 所示 代码展示 package chapter_14;import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layou…

“萝卜快跑”来了,AGV无人仓距离爆发还有多远?

AGV 今年7月&#xff0c;百度公司在武汉运营的无人出租车平台“萝卜快跑”&#xff0c;成为关注热点。 据悉&#xff0c;短短一个月时间内&#xff0c;“萝卜快跑”订单量突破300万。2024年百度计划投入1000辆无人车724小时全无人运营&#xff0c;覆盖武汉全城&#xff0c;大有…

leetcode94. 二叉树的中序遍历,递归法+迭代法。附带前序遍历方法

leetcode94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; …

MAVSKD-Java开源库mavsdk_server库macOS平台编译

1.下载源码 2.使用IDEA打开,进行mavsdk_server目录,使用gradle进行编译 3.开始编译时会自动下载依赖 4.下载完成后,会自动编译 5.编译成功 6.成功生成AAR文件

计算机毕业设计-基于Springboot的养老院管理系统-源码程序文档

项目源码&#xff0c;请关注❥点赞收藏并私信博主&#xff0c;谢谢~ 本系统开发采用技术为JSP、Bootstrap、Ajax、SSM、Java、Tomcat、Maven 此文章为本人亲自指导加编写&#xff0c;禁止任何人抄袭以及各类盈利性传播&#xff0c; 相关的代码部署论文ppt代码讲解答辩指导文件…

OWASP 移动应用 2024 十大安全风险

1. OWASP 移动应用 2024 十大安全风险 开放全球应用程序安全项目 &#xff08;OWASP&#xff09; 是一个非营利性基金会&#xff0c;致力于提高软件的安全性。自 2014、2016 年两次发布了移动应用的十大风险后&#xff0c;今年再次发布2024版。这对移动应用软件的检查工具有着…

Java二十三种设计模式-抽象工厂模式(3/23)

抽象工厂模式&#xff1a;复杂系统的灵活构建者 引言 在软件开发中&#xff0c;抽象工厂模式是一种提供接口以创建相关或依赖对象族的创建型设计模式。这种模式允许客户端使用一个共同的接口来创建不同的产品族&#xff0c;而无需指定具体类。 基础知识&#xff0c;java设计模…

【.NET全栈】ASP.NET开发Web应用——站点导航技术

文章目录 前言一、站点地图1、定义站点地图文件2、使用SiteMapPath控件3、SiteMap类4、URL地址映射 二、TreeView控件1、使用TreeView控件2、以编程的方式添加节点3、使用TreeView控件导航4、绑定到XML文件5、按需加载节点6、带复选框的TreeView控件 三、Menu控件1、使用Menu控…

初学者对 WebGL 与 WebGPU 的看法(A Beginner’s Perspective of WebGL vs WebGPU)

初学者对 WebGL 与 WebGPU 的看法&#xff08;A Beginner’s Perspective of WebGL vs WebGPU&#xff09; WebGL 和 WebGPU 之间的主要区别&#xff1a;WebGL 是什么以及它适合哪些人使用&#xff1f;WebGPU 是什么&#xff1f;它适合谁使用&#xff1f;WebGL 和 WebGPU 的代码…

<数据集>UA-DETRAC车辆识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;20500张 标注数量(xml文件个数)&#xff1a;20500 标注数量(txt文件个数)&#xff1a;20500 标注类别数&#xff1a;4 标注类别名称&#xff1a;[car, van, others, bus] 序号类别名称图片数框数1car201871259342…

Jupyter Notebook安装及基本使用

Jupyter Notebook安装及基本使用 目录 Jupyter Notebook安装及基本使用方式一&#xff1a;Anaconda直接安装方式二&#xff1a;pip命令安装Jupyter使用虚拟环境 方式一&#xff1a;Anaconda直接安装 安装Anaconda 下载地址&#xff0c;输入邮箱&#xff0c;Windows下载 开始安…