一、为什么要平台独立
        Java是一门为了网络环境而开发的语言,这要求Java程序的二进制形式可以在多种不同的平台上无差别的执行。
在开发者这一边,是用Java开发就可以获得平台独立性,这使自己的软件多了很多潜在的客户。
二、Java体系对Java平台独立性的支持
        1、Java平台(The Java Platform)

Java体系结构通过很多种方法支持Java的平台独立性,其中Java平台的支持是最有力的。Java平台是Java程序和本地操作系统之间的隔离带。 Java程序编译为可以在Java虚拟机上执行的字节码,有Java虚拟机执行程序,并且通过Java API访问本地资源。所以Java程序的执行不用关心在那里执行程序,只要那种平台上有Java品台就可以。

2、Java语言

Java语言中直接定义了所有原始类型(primitive types)的长度和行为。而C++中这些都要依赖于编译程序的平台。

3、Class文件

严格定义文件格式,字节码(big-endian)不依赖于任何平台。

4、可伸缩性

对于系统独立性而言,Java的可伸缩性也功不可没。Java平台能够在很多平台上实现,无论是嵌入式设备还是PC。
        为了实现这种目标,Java平台必须能够紧凑的实现在那种嵌入式设备上,比如那些只有很小可寻址内存,没有硬盘,没有显示设备的机器环境。为此,Java 平台有一些针对特殊嵌入式设备的实现,比如:the Java Embedded Platform、the Java Personal Platform、the Java Card Platform。在这种环境下往往只现实Java平台的子集。
        但是这种实现并不限制在个人电脑(personal computers)、工作站(workstations)、大型主机(mainframes)上Java平台的实现。

三、影响平台独立的因素
        1、Java平台的配置

平台独立最基本的要求就是目标平台没有已经实现的Java平台。不过庆幸的是Java平台可以通过网络浏览器来配置、启动

2、Java平台的不同版本和不同版本号(The Java Platform Version and Edition)

Java核心API(Java Core API),所有Java平台必须支持的Java API被称为Java 核心API,实现了Java核心API的Java平台被称为Java核心平台(Java Core Platform),前边提到的Java的其他三种版本:the Embedded, Personal, and Card Platforms只提供Java核心API的部分实现。不是必须实现的Java API被称为Java扩展API(Java Standard Extension API),比如通信、商业支持、多媒体、3D。使用了扩展API的程序不能够在只实现了Java核心API的核心平台上运行。
        同一Java平台的各个版本之间也没有实现兼容,为了更好得提供服务,Java平台的发展过程中,不停的会有一些API被删除和添加,这导致Java的各个平台之间不能够兼容。

3、本地方法

除了Java平台的配置和不同Java平台间的兼容性这些我们不可以控制的因数外,对平台独立性影响最大的就算本地方法了。只要你在程序中直接或者间接的调用了本地方法,你就丢失了Java程序平台独立的特性。
        但是,当你不考虑平台独立时,使用本地方法还是可行的。一般来说在三种情况下应该直接调用本地方法:
        1)、当需要访问Java API无法访问的底层系统资源时;
        2)、当要重用遗留系统中的非Java库时;
        3)、为了提升系统的执行速度,本地化一些核心代码时。
        如果你又想使用本地化代码,又想实现平台独立性时,就必须手工在多个平台上实现本地化代码。

4、非标准类库

如果使用了非平台独立的第三方类库,即使没有直接调用本地方法,程序也可能不是平台独立的。比如AFC(Application Foundation Classes),由微软实现,只能运行在微软平台上的Java类库。但是如果想直接调用(COM (Component Object Model)),也只有使用AFC。

5、Java虚拟机的相关性

为了实现Java程序的平台独立性,必须要遵守两天规则:
        1)、不要依赖于Java的finalization方法来实现强制垃圾收集;
        2)、不要依赖于Java的线程优先级来实现程序的同步。
        所有Java虚拟机必须好有垃圾收集堆,但是Java虚拟机的不同实现能够使用不同的垃圾收集技术。这种柔韧性使得不同的Java虚拟机意味着一个 Java程序中的对象可能会在不同被“垃圾收集”。垃圾收集实现的不同关键就是finalizers方法,这个在对象被垃圾收集之前调用的方法。这个方法 可能会被不同Java虚拟机的实现在不同的地方调用。如果你使用finalizers方法来释放资源,可能在一些Java虚拟机的实现被正常调用,而在另 一些可能会在垃圾收集之前用完所有的资源。
        另一个可能变化的就是Java的线程优先级。Java虚拟机必须实现所有有高优先级的线程能够获得一些CPU时间,但也必须保证那些低优先级的线程必须在 高优先级的线程堵塞时能够运行。但是这些并没有阻止低优先级的线程在高优先级线程没有堵塞时运行。这意味着即使高优先级的线程没有被堵塞,低优先级的线程 也会获得CPU时间。如果你使用线程优先级来实现协调线程同步,可能在一些虚拟机上能够正常运行而在其他的虚拟机上可能不能正常执行。为了保证Java的 多线程程序能够实现平台独立性,你必须使用同步(synchronization)而不是线程优先级来协调线程。

6、用户界面的相关性

另一个阻碍程序平台独立性的就是用户界面。AWT用户界面给了我们一个在各个平台都映射的基础用户界面。虽然一些类库,比如微软的AFC (Microsoftís AFC),网景的IFC(Netscapeís IFC),SUN的JFC(Sunís JFC),给了你一些不依赖于本地方法的高层的接口,但是要实现一个让所有平台的用户都能够束缚使用的用户界面,可并不是一件容易的事情。

7、Java平台实现中的bug

虽然Sun提供了一个所有Java平台都必须实现的测试,但是依然可能有一些Java平台的发布时存在一些Bug。为了预防这种可能性唯一的方法就是测 试。如果有Bug,你就必须判断这个Bug是否会影响到你的程度。不影响最好,如果影响你就必须尝试能否绕开这个Bug了。

8、测试

如果想让自己的程序真正做到平台独立性,你就必须在所有你想发布程序的机器上通过对应Java平台的测试。这是保证Java程序平台独立的最关键因素。

四、平台独立的七个步骤
        1、选择一些想要发布程序的目标机器(target hosts)
        2、选择一个你认为适合你所发布用的Java平台,并在这个平台上开发、执行你的程序
        3、为每个目标机器选择一些你的程序可能会被发布到的Java平台(target runtimes)
        4、通过标准运行库的Java API来访问本地资源,不要通过本地方法或者使用本地方法的第三方运行库。
        5、不要让你的程序依赖于Java平台垃圾收集及时调用finalization方法,不要依赖于Java的线程优先级来协调多线程。
        6、设计一个所有能在目标机器上能够正常工作的用户界面
        7、在所有的可能运行平台和机器上测试你的程序
        如果你愿意,你可以让你的程序成为纯正的Java程序(100% Pure Java)。你可以通过运行Sun免费提供的认证工具(100% Pure verification tools)来完成认证。这个程序可以让你不运行自己的程序来判断程序的“纯正度”。如果你通过了认证,你就可以使用Sun的纯正Java图标(100% Pure Java coffee cup icon)。
        但是通过认证,并不意味你的程序已经完全实现了平台独立性,这个认证只是判断你的程序是否仅仅依赖于Java核心类库。但是,在你实现平台独立性的过程中,执行这个认证还是值得的。
五、平台独立的策略
        Java平台的供应商可以提供自己的Java平台的扩展,这些扩展可能是依赖于特定平台的,但是所有的Java平台的实现必须实现Java的核心组件。如 果你只使用核心组件来实现你的程序,你就可能让你的程序“run anywhere”,但是你必定受到最小公约数问题(lowest-common-denominator problem)的苦恼。但是如果你使用了特定Java平台扩展的类库,你就可能最大限度的使用本地环境的优势。那一种更适合,就需要开发者自己去抉择。

Java的平台独立性相关推荐

  1. 基于Java EE平台项目管理系统的设计与实现(论文+PPT+源码)

    分类号_______________ 密级________________ UDC _______________ 学号 毕业设计(论文) 论文题目 基于Java EE平台项目管理系统的设计与实现 T ...

  2. Rails工作效率和Java运行平台

    Rails工作效率和Java运行平台 --读<JRuby实战>(Practical JRuby on Rails Web 2.0 Projects) 有感 在Web软件开发方面,Rails ...

  3. 最新的Java SE平台和JDK版本发布计划

    最近发布的Java 9带来了诸多重大变更,包括一个全新的版本发布计划.该发布计划基于JEP 223,主要用于Java平台未来的版本发布. \\ 不过在新版本计划发布之后,Java首席架构师Mark R ...

  4. solaris安装java_Solaris是出色的Java开发平台的原因

    solaris安装java 几天前,我发布了" OpenSolaris的死亡:为Java开发人员选择操作系统 ",其中我说Solaris是Java开发人员的绝佳平台. 这篇文章的重 ...

  5. Solaris是出色的Java开发平台的原因

    几天前,我发布了" OpenSolaris的死亡:为Java开发人员选择操作系统 ",其中我说Solaris是Java开发人员的绝佳平台. 这篇文章的重点只是想知道自OpenSol ...

  6. java开发平台普元_java开发平台的两种实现模式

    从目前国内主流的java开发平台看,主要有两种实现模式:引擎模式及生成源代码模式.引擎模式比较有代表性的是华丹平台(https://www.huadaninfo.com),生成源代码模式比较有名是的普 ...

  7. amd cpu不能在cmd环境下运行java代码_「我们一起学Java02」JDK、JRE、JVM简介,Java开发平台的搭建...

    Hello,各位头条的读者大家好!接下来一段时间小编将和大家一起学习Java,"我们一起学Java"专题将会持续更新,欢迎大家关注.这里是"我们一起学Java" ...

  8. java与平台无关的原因

    Java字节码 Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行.解释是通过Java虚拟机来执行的. java要运行要经过如下步骤 ① J ...

  9. java解析ceb文件_什么是Java的平台无关性

    Hello,各位小伙伴是不是对于Java面试很头疼呢? 我以前跟你们一样也是如此,今天我给大家分享一些经验与技巧. 首先回顾一下,上一篇文章,我们说到了对JAVA的理解,那么这一节课开始我们将重点分析 ...

最新文章

  1. Python基础知识(第七天)
  2. 一种求任意多边形内部水平方向似最大矩形的算法
  3. 【数据结构与算法】之深入解析“买卖股票的最好时机含手续费”的求解思路与算法示例
  4. 利用 NGINX 最大化 Python 性能,第二部分:负载均衡和监控
  5. 三年级神奇电子计算机教案,人教版小学三年级下册信息技术教案
  6. 配置设备作为DHCP 服务器(基于全局地址池)
  7. sklearn学习5-----模型评估(1) 分类度量
  8. CPU cache侧信道攻击
  9. pod容器发生OOM错误(by quqi99)
  10. C++知识小屋(3):用虚基类构造仙法·风遁·螺旋手里剑
  11. Failed to introspect Class FeignClientFactoryBean 异常排查
  12. 计算机表格里的隐藏怎么弄出来怎么办,电脑表格隐藏不见了怎么办
  13. 国产电动汽车与特斯拉差多少?
  14. 洛谷P2619 [国家集训队]Tree I 题解
  15. 计算机无法准确计算浮点数,浮点数计算异常原因(转)
  16. java中finally语句是否一定会被执行
  17. “校园安全+教务管理+家校互动+教育大数据”创造安全的家校生态环境
  18. 遇见未来的自己——2021篇
  19. android 复制,粘贴
  20. 我的.NET书架 (进阶篇)

热门文章

  1. Linux 指令篇:讯息传送与信件管理--mailq
  2. 安卓和ios的ui设计区别_Andoridios基础UI设计规范
  3. Dia 在Ubuntu系统下无法输入中文解决方法
  4. 绝非夕阳产业 半导体资本支出持续增长
  5. GO语言-区块链离线钱包开发之如何存储私钥
  6. edu7.X安装教程
  7. Flutter i18n插件使用
  8. 湖北省经济和信息化委员会主任欧阳万坤调研达梦数据库
  9. Java开发快速学习!黑马java项目实战
  10. 某券商自营部量化策略岗的面试题