单根结构
在面向对象的程序设计中,由于C++的引入而显得尤为突出的一个问题是:所有类最终是否都应从单独一个 基础类继承。在Java 中(与其他几乎所有OOP语言一样),对这个问题的答案都是肯定的,而且这个终级基 础类的名字很简单,就是一个“Object”。这种“单根结构”具有许多方面的优点。 单根结构中的所有对象都有一个通用接口,所以它们最终都属于相同的类型。另一种方案(就象 C++那样) 是我们不能保证所有东西都属于相同的基本类型。从向后兼容的角度看,这一方案可与C 模型更好地配合, 而且可以认为它的限制更少一些。但假期我们想进行纯粹的面向对象编程,那么必须构建自己的结构,以期 获得与内建到其他 OOP 语言里的同样的便利。需添加我们要用到的各种新类库,还要使用另一些不兼容的接 口。理所当然地,这也需要付出额外的精力使新接口与自己的设计方案配合(可能还需要多重继承)。为得 到C++额外的“灵活性”,付出这样的代价值得吗?当然,如果真的需要——如果早已是 C 专家,如果对C 有难舍的情结——那么就真的很值得。但假如你是一名新手,首次接触这类设计,象Java 那样的替换方案也 许会更省事一些。 单根结构中的所有对象(比如所有 Java 对象)都可以保证拥有一些特定的功能。在自己的系统中,我们知道 对每个对象都能进行一些基本操作。一个单根结构,加上所有对象都在内存堆中创建,可以极大简化参数的 传递(这在 C++里是一个复杂的概念)。 利用单根结构,我们可以更方便地实现一个垃圾收集器。与此有关的必要支持可安装于基础类中,而垃圾收 集器可将适当的消息发给系统内的任何对象。如果没有这种单根结构,而且系统通过一个句柄来操纵对象, 那么实现垃圾收集器的途径会有很大的不同,而且会面临许多障碍。 由于运行期的类型信息肯定存在于所有对象中,所以永远不会遇到判断不出一个对象的类型的情况。这对系
35
统级的操作来说显得特别重要,比如违例控制;而且也能在程序设计时获得更大的灵活性。 但大家也可能产生疑问,既然你把好处说得这么天花乱坠,为什么C++没有采用单根结构呢?事实上,这是 早期在效率与控制上权衡的一种结果。单根结构会带来程序设计上的一些限制。而且更重要的是,它加大了 新程序与原有C 代码兼容的难度。尽管这些限制仅在特定的场合会真的造成问题,但为了获得最大的灵活程 度,C++最终决定放弃采用单根结构这一做法。而 Java 不存在上述的问题,它是全新设计的一种语言,不必 与现有的语言保持所谓的“向后兼容”。所以很自然地,与其他大多数面向对象的程序设计语言一样,单根 结构在 Java 的设计方案中很快就落实下来。
1 package Com.TomTest; 2 3 4 abstract class As { 5 abstract int min(int x,int y); 6 int max(int x,int y) { 7 return x>y?x:y; 8 } 9 } 10 class B extends As { 11 int min(int x,int y) { 12 return x<y?x:y; 13 } 14 } 15 public class TomTest_28 { 16 public static void main(String args[]) { 17 As a; 18 B b=new B(); 19 int max=b.max(12,34); 20 int min=b.min(12,34); 21 System.out.println("max="+max+" min="+min); 22 a=b; 23 max=a.max(12,34); 24 System.out.println("max="+max); 25 } 26 }