转载自:http://www.cnblogs.com/Y/archive/2011/03/22/JavaVM_Learning_Chapter2_Platform_Independence.html

为什么要平台无关?

废话!当然是方便了,你随手写一个Hello,world!,地球上所有的设备都能显示出来,那多牛B!写hello,world! 你可能觉得没有用,那要是写一句“今年过节不收礼。。。”,钱是不是就开始掉下来了?

Java体系结构对平台(操作系统)无关的支持

这部分是本章中我最觉得有用的,如下:

  1. Java平台提供平台无关性。把脏活累活留给自己,打掉牙往肚里吞,对外始终保持一个样(小样?)。
  2. Java语言提供平台无关性。由于不需要针对特定操作系统,Java语言就只针对Java的平台,所以就不会出现大端小端的问题,不会出现int的占位长度问题等等。
  3. Java的class文件提供平台无关性。就是说,不仅语言提供无关性,把语言扁(编)过以后,还是无关。
  4. 可 伸缩性。如果把windows、linux、unix、mac等等看做是横向的系统,在这些系统上Java可以提供相同的功能。那么大型机、小型机、微型 机、嵌入式设备就是纵向的,Java通过对自身平台的扩展或者缩减来提供不同规模和功能的系统。相当于windows的桌面平台、服务器平台和嵌入式平台 (Windows CE/Mobile)。

其实,一二三点都是基 于Java平台本身无关带来的,就是从源代码->中间文件->实现功能 这三级都通通统一(拗口吧)。这个思想应该值得我们在设计平台时借鉴,在设计一个业务平台时,考虑分层(类似 实现/功能/中间文件/代码)时,尽量提供可扩展和可伸缩的设计,让后期的功能改变都只影响尽量少的模块(这句话我写是写了,但是感觉有些空,就权当是耳 边风吧,反正又不收钱)。

另外,从第四点中,我倒是稍微搞清楚了不同类型Java平台的作用了。J2EE、J2SE、J2ME分别针对企业应用、桌面应用和移动应用。微软有分移动平台和桌面平台,但是好像没有把企业应用单独分出来。

影响平台无关的因素

这一部分的意思主要就是:其实Java也不是真的就能把所有的系统全部都吃进去,由于有如下因素:

  1. Java平台的部署。就是指这个系统中是否支持Java。这个真的是废话了,如果不支持,Java平台的本地实现从天上掉下来?
  2. Java平台的版本。一个是指企业/桌面/移动的不同版本,一个是指平台的版本号变迁。这两个都好理解,前一个是范围的问题,后一个是版本前后兼容的问题。
  3. 本 地方法。想平台无关,就不要用本地方法。但是一定要用怎么办?一个是就不要追求平台无关了,这个做法是最常见的,用于兼容老的、特定的软硬件系统,或者根 本就没有跨平台的需要。另外一个是在所有的系统中都加上本地方法,把本地方法融入到你自己的Java平台中,让它变成YourJava平台的一部分,当然 了,代价就是你要去做原来Sun/Oracle做的事情。
  4. 非标准运行时 库。我真是天才,上面一点中我就想到了把自己的方法变成YourJava平台的一部分,这里马上就提到了很多厂商就提供了自己的库。厂商一般需要先提供标 准的Java运行时库,然后提供扩展的功能,提供N多系统对应的CompanyJava平台版本,越是NB的厂商,其功能就越强大,支持的系统就越广泛 (MS例外)。
  5. 对虚拟机的依赖。finalization和thread prioritization这两个功能可能会因为不同开发商实现的不同导致平台依赖性,所以,不要用这两个特性。这个说法我以前没有接触到,所以理解可能有问题,以后想通了再回来补充一下。
  6. 对 界面的依赖。这个简单,打开一个软件,你一眼就能发现:这个是windows软件,这个是苹果上面的,这个是Java的,这个是Dos的,不同的操作系统 都有自己的典型界面,用户可能习惯于这个界面,所以理论上,Java软件具有统一界面且不与系统相关,刚开始的时候, 谁都看它不顺眼(因为和谁都不一样呗!)这个貌似现在有做法是做成界面本地系统化,让不同系统上的Java调用该系统对应的界面,以达到欺骗用户双眼和蒙 蔽用户心灵的双重功效。
  7. Bug。不懂,谁都有Bug,这个影响什么?
  8. 测试。不测试好所有的系统就无法说全系统平台无关。实际使用中,把能涉及到的系统都测试一下就OK了,不可能做个qq还要求神马也支持。

如何做到平台无关

考虑如下因素:

  1. 选对象-软件要运行在哪些软硬件系统上?
  2. 选平台-Java平台和版本,如写手机软件用J2EE,写QQ for iPad用J2SE的win7版本,做网站用J2ME,这些都是找死的做法,千万不要哦。另外,版本号也是非常重要,对于新老系统的兼容性也需要考虑。
  3. 选运行时-平台规平台,实现归实现,选微软的和IBM的就是不一样的,这个也需要好好考虑,一旦确定后,通常是不好变的,小变可以,大变比较困难。
  4. 只用改用的-只用标准的,本地的、厂商特有的,通通不用!这个有时候比较难,要不然为什么我选那个厂商呢?
  5. 不依赖虚拟机-这个我不熟悉,参看上面“影响平台无关的因素”中的第五点。
  6. 做一个界面-这个我不懂,意思是说,做一个界面,这个界面在所有的系统上都能正常工作,是说不让用特别的控件或实现方式吗?。
  7. 测试-就是所有系统都测试一下,不要只测试一个,就觉得其它的都没有问题了。看吧,Java也不是真的就只在一个操作系统上搞定,就能搞定所有的了,平台无关还是一个相对的概念。

如果你都做到了,也不一定就行,反正最终是以实际结果为准,如果结果也都OK,你就能用一个咖啡的标记表示纯正的麦斯威尔,不对,是Java。

平台无关性的策略

有 一些厂商提供了Java的运行时库,增加了自己的功能,提供了一些独有的工具,你需要作出选择,到底用谁的。我现在的水平和money观念还顾不上这么 多,搞不好一天换3套平台都是有可能的,一般是听有经验的同事或者上网看看别人的评价(可惜不如淘宝的方便和真实),然后作出一个决定就行了。如果错了怎 么办?凉拌!换一个不就得了。

心得

没有想到这么一章我不是很感兴趣的章节还打了这么多字,我是不是很久没有打字了?

说实话,这一章主要是比较系统性的理顺了我之前对Java的宏观理解,包括企业/桌面/移动的分类,Java是需要在不同系统上专门实现的,企业可以基于Java平台的标准,自己提供实现。还是有收获的,不然真不会写这么多!

Java的平台无关性的更多相关文章

  1. 深入Java虚拟机(2)——Java的平台无关性

    一.平台无关性的好处 Java技术在网络环境下非常有用,其中一个关键理由是,用Java创建的可执行二进制程序,能够不加改变地运行于多个平台. 这样的平台无关性随之带来许多的好处.这将极大地减轻系统管理 ...

  2. Java的平台无关性如何体现出来的

    传统的编程中,源代码编译为可执行的代码后,只能针对特定的平台(操作系统),换句话说,针对Windows编写和编译的代码,只能在Windows上运行... java程序则编译为字节码.字节码本身不能运行 ...

  3. Java虚拟机平台无关性

    jruby Java 虚拟机面试题全面解析(干货) - Yano_nankai的博客 - CSDN博客 http://m.blog.csdn.net/Yano_nankai/article/detai ...

  4. 深入Java虚拟机读书笔记第二章平台无关性

    Java的体系结构对平台无关的支持 Java平台 Java的体系结构通过几种途径支持Java程序的平台无关性,其中主要是通过Java平台自己.Java平台扮演一个运行时Java程序与其下的硬件和操作系 ...

  5. Java是如何实现平台无关性的

    相信对于很多Java开发来说,在刚刚接触Java语言的时候,就听说过Java是一门跨平台的语言,Java是平台无关性的,这也是Java语言可以迅速崛起并风光无限的一个重要原因.那么,到底什么是平台无关 ...

  6. Java 平台无关性的基石

    Java 在刚刚诞生之初就提出过一个非常著名的口号:"一次编写,到处运行", 这句话充分表达了软件开发人员对冲破平台界限的渴望 在竞争激烈的 IT 领域,各种不同的硬件体系结构和不 ...

  7. Java虚拟机的平台无关性与语言无关性

    平台无关性 不同平台的不同java虚拟机,都执行同一种字节码文件,即Class文件 语言无关性 Java虚拟机不止能执行java程序,还有Clojure.Groovy.JRuby.Jython.Sca ...

  8. Java虚拟机与平台无关性

    概述 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. --<深入理解Java虚拟机>(从这里可以看到,字节码是一种文件格式) 我们都知道计算机只 ...

  9. JVM(二),Java怎样实现一次编译到处运行(平台无关性)

    二.Java怎样实现一次编译到处运行(平台无关性) 1.java平台无关性原理 Java源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要进行重新编译,Jav ...

随机推荐

  1. php数据库操作常用相关函数

    MySQL访问函数都需要有相应的权限才能运行.常用的相关函数介绍如下: (1)integer mysql_connect(主机,用户名,口令); 此函数开始一个对指定主机上的MySQL数据库的连接.若 ...

  2. JavaScript —— attachEvent 方法的使用

    动态地给一个对象添加事件(方法). 直接上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...

  3. serialize-and-deserialize-bst

    https://leetcode.com/problems/serialize-and-deserialize-bst/ 1. 用到Java Queue接口, // LinkedList实现了Queu ...

  4. 内存分配(c/c++)

    C++中内存分配          内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1,栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的 ...

  5. js中encode、decode的应用说明

    escape 方法 返回一个可在所有计算机上读取的编码 String 对象. function escape(charString : String) : String 参数 charString 必 ...

  6. LA 4255 (拓扑排序 并查集) Guess

    设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...

  7. C++实现顺序表

    #include<iostream>using namespace std; typedef int DataType; class SeqList{public:    SeqList( ...

  8. 监听器Listener

    监听器 6个事件类,均以event结尾 *某些操作,如启动/关闭容器,创建/销毁会话,都将触发一种事件发生,当发生了某种事件,容器将创建对应的事件类对象 8个监听接口,均以Listener结尾 监听器 ...

  9. 修改Android系统字号(一)

    /*********************************************************************** * 修改Android系统字号(一) * 说明: * ...

  10. NBUT 1120 Reimu's Teleport (线段树)

    题意: 有n个格子,一开始全部面向top.接下来的每次修改F a b ,如果 a>b则将a~b之间的格子全面置为向右,否则置为向左.对于每个询问Q输出向左.top.右的数量. 思路: 普通线段树 ...