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://xiahunao.cn/news/3249245.html

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

相关文章

阿尔泰科技工业电脑IPC-8363工控机

概述: IPC-8363是一款支持 LGA 1200 Intel 10th/11th Generation Core™ i9/i7/i5/i3, Celeron and Pentium processor 的工业电脑。配置2组独立 SO-DIMM DDR4 2666/2933MHz内存,最大可扩展至128GB。 主要技术指标: 产品图示: 系…

PyTorch 深度学习实践-循环神经网络(高级篇)

视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记总代码练习 上课笔记 个人能力有限,重看几遍吧,第一遍基本看不懂 名字的每个字母都是一个特征x1,x2,x3…,一个名字是一个序列 rnn用GRU 用ASCII表作为词典,长度为128&#x…

加密传输及相关安全验证:

1.1. 加密: 1.1.1. 对称加密: 特点:加解密用一个密钥,加解密效率高,速度快,有密钥交互的问题问题:双方如何交互对称密钥的问题,用非对称密钥的公钥加密对称密钥的混合加密方式常用…

开源安全态势感知平台Security Onion

简介 Security Onion是一款由安全防御人员为安全防御人员构建的免费开放平台。它包括网络可见性、主机可见性、入侵检测蜜罐、日志管理和案例管理等功能。详细信息可以查看官网Security Onion Solutions 在网络可见性方面,Security Onion提供了基于签名的检测&…

【JS逆向课件:第一课:requests基础】

爬虫初始 爬虫相关介绍 什么是爬虫 就是编写程序,模拟浏览器上网,让其去互联网中抓取数据的过程 模拟: 浏览器本身就是一个纯天然的爬虫工具,爬虫相关的模块都是基于浏览器为基础开发出来的。注意:日后只要是你的爬虫…

【开发踩坑】使用PageHelper工具正常sql后面多无关语句

背景 SQL日志打印出现了脏东西: 本来结束的 where muc.code ?;后面凭空多出了一个 LIMIT语句 ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your …

使用 Flask 3 搭建问答平台(三):注册页面模板渲染

前言 前端文件下载 链接https://pan.baidu.com/s/1Ju5hhhhy5pcUMM7VS3S5YA?pwd6666%C2%A0 知识点 1. 在路由中渲染前端页面 2. 使用 JinJa 2 模板实现前端代码复用 一、auth.py from flask import render_templatebp.route(/register, methods[GET]) def register():re…

汇编教程2

本教程主要教大家如何安装32位Linux虚拟机,为后续实验拆炸弹做准备 下载系统映像文件 以Ubuntu14.04.6系统为例 官方网站:下载地址 点击下载图中32位系统 如果官网进不去可以使用镜像网站 清华镜像网站:下载地址 进入之后找到下图中链接…

Android C++系列:Linux线程(四)线程同步

多个线程同时访问共享数据时可能会冲突,这跟我们前面信号文章所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 从内存读变量值到寄存器;寄存器的值加1;将寄存器的值写回内存假设两个线程在多处理器平台上同时执行这三…

13. C++继承 | 详解 | 虚拟继承及底层实现

目录 1.定义 1.1继承的概念 1.2 继承的定义 2. 对象赋值转换 3. 继承中的作用域 a. 隐藏/重定义 (Hiding/Redefinition) b. 重载 (Overloading) c. 重写/覆盖 (Overriding) d. 编译报错 (Compilation Error) 4. 派生类的默认成员函数 构造 拷贝构造 运算符重载 析…

Windows FFmpeg 开发环境搭建

FFmpeg 开发环境搭建 FFmpeg命令行环境搭建使用FFmpeg官方编译的库Windows编译FFmpeg1. 下载[msys2](https://www.msys2.org/#installation)2. 安装完成之后,将安装⽬录下的msys2_shell.cmd中注释掉的 rem set3. 修改pacman 镜像源并安装依赖4. 下载并编译源码 FFmpeg命令行环境…

Harmony 状态管理 @Local 和 @Param

Harmony 状态管理 Local 和 Param Local 背景 Local 是harmony应用开发中的v2版本中 对标**State**的状态管理修饰器,它解决了 State 对状态变量更改的检测混乱的问题: State 修饰的状态变量 可以是组件内部自己定义的State 修饰的状态 也可以由外部父…

mysql常用函数五大类

mysql常用函数 1. 第一类:数值函数1.1 圆周率pi的值1.2 求绝对值1.3 返回数字的符号1.4 开平方,根号1.5 求两个数的余数1.6 截取正数部分1.7 向上取整数1.8 向下取整数1.9 四舍五入函数1.10 随机数函数1.11 数值左边补位函数1.12 数值右边补位函数1.13 次…

从PyTorch官方的一篇教程说开去(3.1 - GD 梯度下降法)

在openAI以前,我们所讨论的“人工智能”基本上都是“人工智障”,即时在某些方面表现得非常出色,击败了世界冠军,但最多算个某领域的“专才”而不是“通才”。 那么这些“智障”程序们,究竟是靠什么才能做到“专才”呢…

【总结】nginx源码编译安装报错./configure: error: SSL modules require the OpenSSL library.

问题现象 源码编译安装nginx时,执行./configure …… --with-http_ssl_module 命令安装https模块,需要用到openssl,由于机器缺少openssl库,报如下错误。 …… checking for openat(), fstatat() ... found checking for getaddr…

Flink HA

目录 Flink HA集群规划 环境变量配置 masters配置 flink-conf.yaml配置 测试 Flink HA集群规划 FLink HA集群规划如下: IP地址主机名称Flink角色ZooKeeper角色192.168.128.111bigdata111masterQuorumPeerMain192.168.128.112bigdata112worker、masterQuorumPee…

MySQL(5)表的查询

目录 1.表的查询 1.表的查询: 1.1创建表: 语法: create table 表名( 字段 类型 约束, 字段 类型 约束, ... 字段 类型 约束 ); 1.2 单行数据全行插入: 🌰 表的字段都插入数据: insert into student values(100, 1000, 唐三藏, null); 1.3 多行数据 指定列插入:…

Go网络编程-RPC程序设计

gRPC 通信 RPC 介绍 RPC, Remote Procedure Call,远程过程调用。与 HTTP 一致,也是应用层协议。该协议的目标是实现:调用远程过程(方法、函数)就如调用本地方法一致。 如图所示: 说明: Servi…

STM32智能安防系统教程

目录 引言环境准备智能安防系统基础代码实现:实现智能安防系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:家庭与企业安防管理问题解决方案与优化收尾与总结 1. 引言 智能安防系统通过STM32…

webrtc QOS方法十三(视频渲染平滑)

一、背景介绍 视频渲染时间的确定需要考虑三方面的因素:网络抖动、网络延时、音视频同步 网络抖动:视频帧在网络上传输,会受到网络抖动的影响,不能收到立刻播放,需要进行适当的平滑 网络延时:一些报文在…