《Java编程思想第4版[中文版](PDF格式)》第287章


15章)。尽管 RMI 使 Java 对象之间进行RPC 调用成为可能,但 CORBA 能在用任何语言编制的对象之间进行 
RPC。这显然是一项很大的区别。
然而,可通过RMI 调用远程、非 Java 代码的服务。我们需要的全部东西就是位于服务器那一端的、某种形式 
的封装Java 对象,它将非 Java 代码“包裹”于其中。封装对象通过RMI 同Java 客户建立外部连接,并于内 
部建立与非 Java 代码的连接——采用前面讲到的某种技术,如 JNI 或J/Direct 。
使用这种方法时,要求我们编写某种类型的“集成层”——这其实正是 CORBA 帮我们做的事情。但是这样做 
以后,就不再需要其他厂商开发的ORB 了。
A。7 总结
我们在这个附录讨论的都是从一个 Java 应用里调用非Java 代码最基本的技术。每种技术都有自己的优缺 
点。但目前最主要的问题是并非所有这些特性都能在所有 JVM 中找到。因此,即使一个Java 程序能调用位于 
特定平台上的固有方法,仍有可能不适用于安装了不同JVM 的另一种平台。
Sun 公司提供的 JNI 具有灵活、简单(尽管它要求对JVM 内核进行大量控制)、功能强大以及通用于大多数 
JVM 的优点。到本书完稿时为止,微软仍未提供对 JNI 的支持,而是提供了自己的J/Direct (调用Win32
DLL 函数的一种简便方法)和RNI (特别适合编写高效率的代码,但要求对JVM 内核有很深入的理解)。微软 
也提供了自己的专利Java/ 集成方案。这一方案具有很强大的功能,且将 Java 变成了编写 服务器和 
客户的有效语言。只有微软公司的编译器和JVM 能提供对J/Direct 、RNI 以及Java/ 的支持。
我们最后研究的是 CORBA,它使我们的Java 对象可与其他对象沟通——无论它们的物理位置在哪里,也无论 
是用何种语言实现的。CORBA 与前面提到的所有技术都不同,因为它并未集成到 Java 语言里,而是采用了其 
他厂商(第三方)的集成技术,并要求我们购买其他厂商提供的ORB。CORBA 是一种有趣和通用的方案,但如 
果只是想发出对操作系统的调用,它也许并非一种最佳方案。
671 
…………………………………………………………Page 673……………………………………………………………
附录 B 对比 C++ 和 Java
“作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是非常熟悉 
的。事实上,Java 本来就是从 C++衍生出来的。”
然而,C++和Java 之间仍存在一些显著的差异。可以这样说,这些差异代表着技术的极大进步。一旦我们弄 
清楚了这些差异,就会理解为什么说Java 是一种优秀的程序设计语言。本附录将引导大家认识用于区分 
Java 和C++的一些重要特征。
(1) 最大的障碍在于速度:解释过的Java 要比C 的执行速度慢上约 20 倍。无论什么都不能阻止Java 语言进 
行编译。写作本书的时候,刚刚出现了一些准实时编译器,它们能显著加快速度。当然,我们完全有理由认 
为会出现适用于更多流行平台的纯固有编译器,但假若没有那些编译器,由于速度的限制,必须有些问题是 
Java 不能解决的。
(2) 和C++一样,Java 也提供了两种类型的注释。
(3) 所有东西都必须置入一个类。不存在全局函数或者全局数据。如果想获得与全局函数等价的功能,可考 
虑将 static方法和 static 数据置入一个类里。注意没有象结构、枚举或者联合这一类的东西,一切只有 
“类”(Class)!
(4) 所有方法都是在类的主体定义的。所以用 C++的眼光看,似乎所有函数都已嵌入,但实情并非如何(嵌 
入的问题在后面讲述)。
(5) 在Java 中,类定义采取几乎和 C++一样的形式。但没有标志结束的分号。没有class foo 这种形式的类 
声明,只有类定义。
class aType()
void aMethod() {/* 方法主体 */}

(6) Java 中没有作用域范围运算符“::”。Java 利用点号做所有的事情,但可以不用考虑它,因为只能在一 
个类里定义元素。即使那些方法定义,也必须在一个类的内部,所以根本没有必要指定作用域的范围。我们 
注意到的一项差异是对 static方法的调用:使用 ClassName。methodName() 。除此以外,package (包)的名 
字是用点号建立的,并能用 import关键字实现 C++的“#include ”的一部分功能。例如下面这个语句:
import java。awt。*;
(#include 并不直接映射成 import,但在使用时有类似的感觉。)
(7) 与C++类似,Java 含有一系列“主类型”(Primitive type),以实现更有效率的访问。在Java 中,这 
些类型包括 boolean,char,byte ,short,int,long,float 以及double。所有主类型的大小都是固有 
的,且与具体的机器无关(考虑到移植的问题)。这肯定会对性能造成一定的影响,具体取决于不同的机 
器。对类型的检查和要求在Java 里变得更苛刻。例如:
■条件表达式只能是boolean (布尔)类型,不可使用整数。
■必须使用象X+Y 这样的一个表达式的结果;不能仅仅用“X+Y”来实现“副作用”。
(8) char (字符)类型使用国际通用的16位 Unicode 字符集,所以能自动表达大多数国家的字符。
(9) 静态引用的字串会自动转换成 String 对象。和C 及 C++不同,没有独立的静态字符数组字串可供使用。
(10) Java增添了三个右移位运算符“》》》”,具有与“逻辑”右移位运算符类似的功用,可在最末尾插入零 
值。“》》”则会在移位的同时插入符号位(即“算术”移位)。
(11) 尽管表面上类似,但与 C++相比,Java 数组采用的是一个颇为不同的结构,并具有独特的行为。有一个 
只读的 length 成员,通过它可知道数组有多大。而且一旦超过数组边界,运行期检查会自动丢弃一个异常。 
所有数组都是在内存“堆”里创建的,我们可将一个数组分配给另一个(只是简单地复制数组句柄)。数组 
标识符属于第一级对象,它的所有方法通常都适用于其他所有对象。
(12) 对于所有不属于主类型的对象,都只能通过new 命令创建。和 C++不同,Java 没有相应的命令可以“在 
堆栈上”创建不属于主类型的对象。所有主类型都只能在堆栈上创建,同时不使用new 命令。所有主要的类 
都有自己的“封装(器)”类,所以能够通过 new 创建等价的、以内存“堆”为基础的对象(主类型数组是 
一个例外:它们可象C++那样通过集合初始化进行分配,或者使用 new)。
(13) Java 中不必进行提前声明。若想在定义前使用一个类或方法,只需直接使用它即可——编译器会保证 
672 
…………………………………………………………Page 674……………………………………………………………
使用恰当的定义。所以和在C++中不同,我们不会碰到任何涉及提前引用的问题。
(14) Java没有预处理机。若想使用另一个库里的类,只需使用 import 命令,并指定库名即可。不存在类似 
于预处理机的宏。
(15) Java用包代替了命名空间。由于将所有东西都置入一个类,而且由于采用了一种名为“封装”的机 
制,它能针对类名进行类似于命名空间分解的操作,所以命名的问题不再进入我们的考虑之列。数据包也会 
在单独一个库名下收集库的组件。我们只需简单地“import”(导入)一个包,剩下的工作会由编译器自动 
完成。
(16) 被定义成类成员的对象句柄会自动初始化成null 。对基本类数据成员的初始化在Java 里得到了可靠的 
保障。若不明确地进行初始化,它们就会得到一个默认值(零或等价的值)。可对它们进行明确的初始化 
(显式初始化):要么
小说推荐
返回首页返回目录