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.mzph.cn/pingmian/48376.shtml

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

相关文章

485开关量采集模块16路I/O输入输出ModbusRTU协议—DAM-3950A

品牌:阿尔泰科技 型号:DAM-3950A 概述: DAM-3950A为16路隔离数字量输入,6路C型10路A型信号继电器输出模块,RS485通讯接口,带有标准ModbusRTU协议。配备良好的人机交互界面,使用方便&#xff…

Linux 文件安装的mysql 启动

1、找到my.cnf 2、确定文件类容: 并确保这些重要的配置:basedir 、datadir、socket 文件或目录都存在 3、找到mysqld 位置 4、启动mysqld mysqld --defaults-file/etc/my.cnf --usermysql

c++基础(类和对象中)(类的默认成员函数)

目录 一.构造函数(类似初始化) 1.概念 2.构造函数的特点 二.析构函数(类似 销毁对象/空间) 三.拷贝构造函数(类似复制粘贴的一种 初始化 ) 1.概念: 2.拷贝构造的特点: 四.赋值运算符重载&#xff08…

level 6 day2-3 网络基础2---TCP编程

1.socket(三种套接字:认真看) 套接字就是在这个应用空间和内核空间的一个接口,如下图 原始套接字可以从应用层直接访问到网络层,跳过了传输层,比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

华为OD机试(C卷,200分)- 二叉树计算

题目描述 给出一个二叉树如下图所示: 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。…

食南之徒~马伯庸

◆ 第一章 >> 老赵,这你就不懂了。过大于功,要受罚挨打,不合算;功大于过,下回上司有什么脏活累活,第一时间会想到你,也是麻烦多多。只有功过相抵,上司既挑不出你的错&#xf…

MMU(内存管理单元)

概述 MMU 即内存管理单元,是用硬件电路逻辑实现的一个地址转换器件,它负责接受虚拟地址和地址关系转换表,以及输出物理地址 线性地址 由于保护模式的内存模型是分段模型,它并不适合于 MMU 的分页模型,所以我们要使用…

springcloud-config客户端启用服务发现报错找不到bean EurekaHttpClient

背景 在对已有项目进行改造的时候,集成SpringConfigStarter,编写完bootstrap.yml,在idea 启动项中编辑并新增VM options -Dspring.cloud.config.discovery.enabledtrue,该版本不加spring不会从configService获取信息,…

三、GPIO口

我们在刚接触C语言时,写的第一个程序必定是hello world,其他的编程语言也是这样类似的代码是告诉我们进入了编程的世界,在单片机中也不例外,不过我们的传统就是点亮第一个LED灯,点亮电阻,电容的兄弟&#x…

[CSS] 浮动布局的深入理解与应用

文章目录 浮动的简介元素浮动后的特点解决浮动产生的影响浮动后的影响解决浮动产生的影响 浮动相关属性实际应用示例示例1:图片与文字环绕示例2:多列布局示例3:响应式布局 总结 浮动布局是CSS中一种非常强大的布局方式,最初设计用…

java项目(knife4j使用,静态资源未放在static资源包下,公共字段自动填充,Spring Cache与Spring Task)

Knife4j(生成接口文档) 使用swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。官网:https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。…

JMeter请求导出Excel

前言 今天记录一个使用JMeter模拟浏览器请求后端导出,并下载Excel到指定位置的过程 创建请求 同样先创建一个线程组,再创建一个请求,设置好请求路径,端口号等 查看结果树 右键--添加--监听器--查看结果树 这里可以查看&#…

Windows搭建RTMP视频流服务器

参考了一篇文章,见文末。 博客中nginx下载地址失效,附上一个有效的地址: Index of /download/ 另外,在搭建过程中,遇到的问题总结如下: 1 两个压缩包下载解压并重命名后,需要 将nginx-rtmp…

【Linux】编辑器vscode与linux的联动

1.vscode简单学习 vscode是编辑器,可以写各种语言的程序 下载链接:Download Visual Studio Code - Mac, Linux, Windows 来用一下vscode 我们保存了就能在我们的那个文件夹里面看到这个 这个就是编辑器,跟我们的文本文件好像差不多&#…

栈及栈的应用(有效的括号 力扣20)

栈的概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 画个图理解一下 咱们可以观…

在项目中加入 husky + lint-staged + eslint,代码检测格式化

背景 由于日常工作的多人协作中,会因为个人代码编写风格导致代码在不同人电脑上,会有异常代码格式的提示,为了解决这个小问题,我们可以使用 husky lint-staged 来对代码进行一定程度上的格式化,使格式风格统一&#x…

jenkins 使用教程

1. 安装最新长期稳定版 2.426.1 Redhat Jenkins Packages sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key yum insta…

ubuntu20.04支持win10远程桌面连接

1. 安装xrdp sudo apt install xrdp 2. 检查xrdp状态 sudo systemctl status xrdp 要处于running状态 3.(若为Ubuntu 20)添加xrdp至ssl-cert sudo adduser xrdp ssl-cert 4. 重启服务 sudo systemctl restart xrdp 5. window 远程桌面连接&am…

大模型实战—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…

Springcloud之gateway的使用详解

官网地址&#xff1a;https://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/ 1.网关入门 helloword 网关不依赖start-web 导入的pom&#xff1a; <!--gateway--> <dependency><groupIdorg.springframework.cloud</groupId><arti…