Java的平台无关性,概念听起来比较抽象。说简单通俗一线。Java的跨平台执行。
我们编写的Java代码可以在不同的操作系统平台,Winlinux、mac等系统上运行、、
底层使用了JVM的Java虚拟机托管执行Java代码。
Java代码第一次编译生成的是中间代码。在JVM里执行在根据具体的系统平台编译成对应的CPU指令执行。
做到与系统平台上的表面无关。
1、Java源代码编译之后得到的是字节码(byte code),不是机器指令。 2、字节码也可以看作是JVM才能看懂的源代码,在运行期间,JVM会将字节码解释、编译为机器指令。 3、Sun公司在开发Java语言时,为不同的系统平台提供了不同版本的JVM,用于将字节码解释、编译为各个系统平台所支持的机器指令。
相当于你只会中文、英文,但你有一个会英文、法文、俄文、日文、意大利文……的翻译。你将想说的中文翻译成英文给他,他就可以翻译成法文、俄文、日文、意大利文……,你可以在这些国家随意的交流。
因为Java代码并不会被直接编译成为机器码执行,二是先编译成为Java字节码,然后不同平台的JRE(Java运行环境)会将Java字节码再编译成为机器码来运行,这样整个结构的上层就平台无关了,所谓一次编译到处运行,就是只一次编译成字节码,字节码在其他平台都可以运行。
C/C++之所以不能跨平台,就是因为C/C++源程序是对平台编译的,所以与平台密切相关。如果有这样的一个环境:它既可以向下兼容(对平台兼容),又可以向上兼容(程序可以运行),那么不就可以跨平台了吗。基于这样的原理,Java在计算机的操作系统上又提供了一个Java运行环境——JRE(安装JDK)。 JRE由Java虚拟机,类库和一些核心文件组成,也就是说,只要平台提供了Java运行环境,Java编写的软件就可以在其上运行。 和C/C++不同的是,Java语言提供的编译器不针对特定的操作系统和CPU芯片进行编程,而是针对Java虚拟机把Java源程序编译成称为字节码的“中间代码”,然后Java虚拟机负责将字节码翻译成虚拟机所在平台的机器码,并让当前平台运行该机器码。 Java语言的运行原理: 在一个计算机上编译得到的字节码文件(就是.class文件),可以复制到任何一个安装了Java运行环境的计算机上直接运行。然后字节码文件由虚拟机负责解释执行,即Java虚拟机将字节码翻译成本地计算机的机器码,然后将机器码交给本地的操作系统运行。
由于在一个计算机上编译得到的字节码文件可以复制到任何一个安装了Java运行环境的计算机上直接使用,所以字节码其实是一种“中间代码”,这也就是为什么“Java语言能够一次编译,处处运行,也就是Java跨平台的原因。”所以称Java是一种“半编译,半解释的语言”,即源程序——>编译——>字节码——>字节码解释程序——>对应平台的机器语言。”
java是基于jvm虚拟机来运行字节码,字节码是由java语言编译而成,不同平台的编译策略是和平台相关的,java语言本身和平台无关,编译器和平台有关
与平台无关是依赖于Java Virtual Machine(JVM),由于他的存在,可以实现一次编译,到处运行,官网文档:https://docs.oracle.com/javase/8/docs/index.html
关于JAVA的平台无关性是怎么体现出来的?为什么Java要支持平台无关性?Java如何支持平台无关性?影响Java平台无关性的因素有哪些?这些方面的详细介绍,推荐你参考详细介绍资料:JAVA的平台无关性
1: 一切都与java虚拟机有关,每个平台都有对应的版本java虚拟机,是与对应系统指令相关的
2: 所谓一套代码,到处运行。得益于sun公司设计的一套新的文件系统,字节码文件。各类语言(java, python等)编写的程序会被虚拟机进行编译处理,生成class文件(内部就是字节码)
3: 此外,java虚拟机也因此具有语言无关性的特点
众所周知,Java是平台无关的语言,那么Java为什么要支持平台无关性,总结一下,有如下几点
支持多变的网络环境。如今是一个互联网的时代,网络将各种各样的计算机和设备连接起来,比如网络连接了windows的PC机,UNIX工作站等等。为了保证程序能够不加任何修改运行于网络上的任何计算机,而不管计算机是什么种类,什么平台,这样就极大减轻了系统管理员的工作。尤其是程序是通过网络环境进行部署的。
支持网络化嵌入式设备。目前工作场所中存在各种各样的嵌入式设备,比如打印机,扫描仪,传真机等。他们往往通过网络连接起来,甚至在家庭网络和汽车内部也存在这样那样的嵌入式设备 。Java的平台无关性可以简化这样的系统管理任务。无论是哪个网络的管理员,它只需关注程序本身即可。此外添加一台新设备,可以立即被其他设备访问到,也可以访问其他设备。这都是平台无关性带来的好处。
减少开发者部署程序的成本和时间。
对于开发者而言, Java平台无关的能力给予网络一个同构的运行环境,使得分布式系统可以围绕着“网络移动对象”开构建。比如对象序列化,RMI, Jini就是利用平台无关性。把面向对象编程从虚拟机带到了网络上。
影响Java平台无关性的因素
Java平台的部署。运行Java程序之前,必须要部署好Java平台。
Java平台的版本。Sun公司提供了不同的API集合,有标准版,扩展版等等。此外API本身也面临着改动,一些API被认为是过期的,一些API甚至不向下兼容,因此我们需要选择合适的Java平台版本支持程序开发。
本地方法。当编写一个平台独立的Java程序时候,最重要的原则是:不要直接或间接调用不属于Java API的本地方法。调用Java API以外的本地方法使得程序平台相关。一般而言,本地方法在三种情况适用:使用底层主机平台的特性,而Java API无法访问;为了访问老系统或者使用现有的库,但是这个系统或库不是Java编写的;为了加快程序性能,将时间敏感代码用本地方法实现。因此当必须使用本地方法,而且支持多种平台运行,必须将本地方法移植到所有需要的平台上。因此编写平台独立的Java程序做主要的目的就是完全禁止本地方法,通过Java API和主机交互。
非标准运行时库。所谓平台无关性,一种解释是你调用的方法是否在任何地方都已经实现。本地方法顾名思义,就是只是在本地实现了,所以无法保证平台无关。而Java API在如windows, Solaris等操作系统上的实现上使用了本地方法访问主机,即保证了平台无关。
对虚拟机的依赖。虚拟机可以由不同开发商开发,但是必须满足如下两条原则:不要依赖及时终结(finalization)保证程序的正确性,因为特定程序中对象可能在不同的时间被垃圾收集;不要依赖线程的优先级来保证程序的正确性。因为一些虚拟机可以实现优先级高线程优先运行,一些虚拟机不能保证这一点。
对用户界面依赖,AWT库提供基本的用户界面,这些组件被映射成每个平台上的本地组件,而Swing库为用户提供更高级的组件,但并没有被映射为本地组件。
实现平台无关的7大步骤
选择程序运行的主机和设备集合(目标宿主机)
在目标宿主机中选择Java平台版本。
对于每个目标宿主机,选择程序将要运行的Java平台实现(目标运行时环境) 。
编写程序,调用Java API标准运行库(不调用本地方法,或者专门开发商专门调用本地方法的库)
编写程序,不依赖于垃圾收集器收集垃圾时间,不依赖线程的优先级
努力设计用户界面,在所有的目标宿主机都能正常工作
在所有目标运行时环境和所有目标宿主机进行测试
Java从四个方面支持了平台无关性
最主要的是Java平台本身。Java平台扮演Java程序和所在的硬件与操作系统之间的缓冲角色。这样Java程序只需要与Java平台打交道,而不用管具体的操作系统。
Java语言保证了基本数据类型的值域和行为都是由语言自己定义的。而C/C++中,基本数据类是由它的占位宽度决定的,占位宽度由所在平台决定的。不同平台编译同一个C++程序会出现不同的行为。通过保证基本数据类型在所有平台的一致性,Java语言为平台无关性提供强有力的支持。
Java class文件。Java程序最终会被编译成二进制class文件。class文件可以在任何平台创建,也可以被任何平台的Java虚拟机装载运行。它的格式有着严格的定义,是平台无关的。
可伸缩性。Sun通过改变API的方式得到三个基础API集合,表现为Java平台不同的伸缩性:J2EE,J2SE,J2ME。
最主要的是Java平台本身。Java平台扮演Java程序和所在的硬件与操作系统之间的缓冲角色。这样Java程序只需要与Java平台打交道,而不用管具体的操作系统。Java程序不需要兼容即可在多个平台运行,Write Once, Run Everywhere。 实现方式是通过在操作系统之上加一层jvm适配不同的平台。
Java平台无关性是Java程序不需要兼容即可在多个平台运行,Write Once, Run Everywhere。 实现方式是通过在操作系统之上加一层jvm适配不同的平台。
一次开发到处运行更好理解一点,就是部署时,Java应用是运行在JVM上的;JVM是需要安装的,每个系统平台的jvm不同,这部分不同对于Java开发者是透明的,java开发者开发同一份代码可以在多个系统平台运行。
所谓的平台无关性,即你写的Java代码可以不作修改在Windows、Linux、Mac上运行,而C则无法做到。
Java能做到的本质是通过JVM 虚拟机来屏蔽掉各种系统的底层差异性。JVM虚拟机是平台相关的
最主要的是Java平台本身。Java平台扮演Java程序和所在的硬件与操作系统之间的缓冲角色。这样Java程序只需要与Java平台打交道,而不用管具体的操作系统。
Java语言保证了基本数据类型的值域和行为都是由语言自己定义的。而C/C++中,基本数据类是由它的占位宽度决定的,占位宽度由所在平台决定的。不同平台编译同一个C++程序会出现不同的行为。通过保证基本数据类型在所有平台的一致性,Java语言为平台无关性提供强有力的支持。
Java class文件。Java程序最终会被编译成二进制class文件。class文件可以在任何平台创建,也可以被任何平台的Java虚拟机装载运行。它的格式有着严格的定义,是平台无关的。
可伸缩性。Sun通过改变API的方式得到三个基础API集合,表现为Java平台不同的伸缩性:J2EE,J2SE,J2ME。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。