从C/C++到Java(二)

1. ISO C中的下列关键字在Java中被剔出:

(1)goto:Java不需要goto,即使是在C中被很好使用的goto。Java的错误处理机制才用的throw/try/catch,有点像C++。
(2)sizeof:Java的基本类型都有固定的大小,而你不需要知道非基本类型的大小,所以Java不需要这个操作符。
(3)typedef:Java的类型使用class来定义,而且不需要为它们起一个别名。

2. ISO C中的下类型(或类型修饰符)被剔出:

struct,union,enum,auto,extern,register,signed/unsigned,volatile

这时你应该能猜到,Java中也不会有位字段。

3. Java中没有宏,Java认为宏会引入一些不良的特性,导致调试困难。;-)实际上,你在C++中也应该避免使用宏。如果你需要常量,请用const。C++之父这样评价宏[The C++ Programming Language]:“如果不是必须,别使用它们……因为它们在编译器看到之前重新安排了程序代码,对于很多编程工具来说宏也是一个很大的问题,所以当你使用宏时你应该预料到一些工具会给你较差的服务,比如:调试器,交叉引用工具和分析器。”

4. Java中没有可变参数,如果你需要不确定个数的参数列表,可以把它们放到Vector里,别担心,Vector里可以放不同类型的数据。

5. 在C中,函数作为独立的单元而存在,而在Java中函数必须在类中,作为类的方法进行定义。C++在Java和C之间做了个整合,怎么定义都可以,这就使得C++的名字空间成为必要。而Java对名字空间的管理有着统一而简洁的规则。

6. 在C++中,把一个类的方法定义在内部意味着该方法要被inline。Java不会,因为它根本就没有头文件和inline关键字。

7. Java中没有严格的声明,只有定义。C++不同,当你在花括号中描述了一个类的成员和方法时,它才算是被定义;否则就是声明。

8. Java没有C++中的友元,在Java中,同一个Package中的类其实就是朋友关系,它们可以访问彼此的protected成员。

9. Java和C++都有构造函数,名字都和类同名,而且可以被重载(overload)。不同的一点是Java没有析构函数,Java中的一个可替代的选择是finalize()函数,它会在适当的时候被GC调用。