自从C++
语言出现以来,面向对象中是否所有的类都应该默认继承自某个基类的问题变得尤为突出。Java 则给出了肯定的答案(除了C++
以外,实际上几乎所有动态面向对象编程语言都是如此),这个终极基类的名字是 Object。
这种 “单根层次结构”(singly-rooted hierarchy)具备很多明显的优势。由于所有对象都具有共同的接口,因此它们都属于同一个终极基类。另一种方案(来自C++
)则无法确保所有对象都属于同一个基类。从向后兼容的角度来看,这种限制性较小的设计方式对 C 语言更为友好,但是从完全的面向对象编程的角度来看,你就必须自己手动构建类的层次,这样才能拥有其他面向对象编程语言默认提供的便捷性。此外,你在使用任何新的库时,都有可能遇到一些不兼容的接口。如果你希望这些接口为你所用,就必须额外花费一些精力来改造它们。所以,C++
这种额外的“灵活性”真的物有所值吗?如果需要的话,比如你已经花费了大量心血编写 C 语言代码,那么答案就是肯定的。而如果你是从头开始,那么使用 Java 或者其他替代方案则会高效许多。
单根层次结构有利于实现垃圾收集器(garbage collector),这也是 Java 对比C++
的一个重要改进。既然所有对象都拥有类型信息,你就再也不用发愁不知道某个对象具体是什么类型了。这一特性对于系统级别的操作而言尤为重要,比如异常处理(exception handling,一种用于处理错误的语言机制)等,同时也极大地提升了编程时的灵活性。