Java=C++– –.

发布于 2017-11-04  368 次阅读


Bill Joy - Java=C++--

在早期的一次Java 演讲中,Bill Joy(始创人之一)声称“Java=C++--”(C 加加减减),意味着Java 已去除了C++一些没来由折磨人的地方,形成一种更精简的语言。正如大家会在这本书中学到的那样,Java 的许多地方都得到了简化,所以Java 的学习比C++更容易。

Java和C++的对照:设计目标

C++和Java语言之间的不同可以追溯到它们各自的传统,它们有着不同的设计目标。

  • C++ 被设计成主要用在系统性应用程序设计上的语言,对C语言进行了扩展。对于C语言这个为运行效率设计的过程式程序设计语言, C++ 特别加上了以下这些特性的支持:静态类型面向对象程序设计的支持、异常处理RAII以及泛型。另外它还加上了一个包含泛型容器和算法的C++库函数
  • Java 最开始是被设计用来支持网络计算。它依赖一个虚拟机来保证安全可移植性。Java 包含一个可扩展的库用以提供一个完整的的下层平台的抽象。Java 是一种静态面向对象语言,它使用的语法类似C++,但与之不兼容。为了使更多的人到使用更易用的语言,它进行了全新的设计。

不同的开发目标导致 C++ 和 Java 这两种语言的不同的规则以及设计上的平衡点不同。 如下列出不同点:

C++ Java
除了一些比较少见的情况之外和C语言兼容 没有对任何之前的语言向前兼容。但在语法上受 C/C++ 的影响很大
一次编写多处编译 一次编写多处运行
允许过程式程序设计面向对象程序设计 必须使用面向对象的程序设计方式
允许直接调用本地的系统库 要通过JNI调用, 或者 JNA
能直接使用底层系统接口 在一个保护模式下的虚拟机中运行
只提供对象的类型和类型名 反射的, 允许元程序设计和运行时的动态生成代码
有多种二进制兼容标准 (例如:微软和Itanium/GNU) 一种二进制兼容标准,允许运行时库的正确性检查
可选的自动边界检查. (例如: vector 和 string 这两个容器的 at() 方法) 一般都有做边界检查。HotSpot (java)(Sun 的虚拟机实现) 可以去掉边界检查
支持本地的无符号数学运算 不支持本地的无符号数学运算
对所有的数字类型有标准的范围限制,但字节长度是跟实现相关的。标准化的类型可以用 typdef 定义 (uint8_t, ..., uintptr_t) 在所有平台上对所有的基本类型都有标准的范围限制和字节长度
支持指针,引用,传值调用 基本类型总是使用传值调用。对象以可以为空的参考的方式传递(相当于在C++里使用指向 class 或者 struct 参数的指针)。[1]
显式的内存管理,但有第三方的框架可以提供垃圾搜集的支持。支持析构函数。 自动垃圾搜集(可以手动触发)。没有析构函数的概念,对 finalize() 的使用是不推荐的
支持类class,结构struct,联合union,可以在堆栈或者里为它们动态分配内存 只支持类别,只在中为对象分配内存。Java SE 6在栈为一些对象分配内存的使用了逃逸分析的优化方法
允许显式的覆盖(也叫重写)类型 严格的类型安全,除了变宽的类型转换。Java 1.5 开始支持自动类型包装和解包装(Autoboxing/Unboxing)
C++库包括:语言支持,诊断工具,常用工具,字符串,本地化,容器,算法,迭代器,数值,输入/输出,C库。Boost库提供了更多的功能,包括线程和网络I/O。用户必须在一大堆(大部分互相不兼容)第三方GUI或者其他功能库中进行选择 库在每次 Java 发布新版本的时候都会更新并增强功能。1.6版本支持:本地化,日志系统,容器和迭代器,算法,GUI 程序设计(但没有用到系统的GUI),图形,多线程,网络,平台安全,自省机制,动态类别加载,阻塞和非阻塞的I/O,对于XMLXSLTMIDI也提供了相关接口或者支持类别,数据库,命名服务(例如 LDAP),密码学,安全服务(例如 Kerberos),打印服务,WEB 服务。SWT 提供了一个系统相关的GUI的抽象
大部分运算符可以运算符重载 运算符的意义一般来说是不可变的,例外是 + 和 += 运算符被字符串重载了
完全的多重继承,包括虚拟继承 类别只允许单继承,需要多继承的情况要使用接口
支持编译期模板 泛型被用来达到和C++模板类似的效果,但由于类型消除它们不能在编译期间从代码被编译成字节码
支持函数指针,函数对象,lambda(C++11)和接口 没有函数指针机制。替代的概念是接口,Adapter 和 Listener也是被广泛使用的
没有标准的代码内嵌文档机制。不过有第三方的软件(例如 Doxygen) Javadoc 标准文档生成系统
const 关键字用来定义不可改变的常量和成员函数 final 提供了一个限制版本的 const,等价于 type* const 的对象指针或者 const的基本类型数据。没有 const 成员函数,也没有const type* 指针的等价物
支持 goto 语句 支持循环标签(label)和语句块
源代码可以写成平台无关的(可以被 WindowsBSDLinuxMac OS XSolaris 等编译,不用修改),也可以写成利用平台特有的特性。通常被编译成本地的机器码 被编译成Java虚拟机的字节码。和Java平台相关,但是源代码一般来说是不依赖操作系统特有的特性的

C++ 是一门强大的语言,设计用在系统程序设计方面。Java语言是设计成简单易用易学习,并有一个强大的跨平台的库。Java对一个库来说相当的大。但Java并不会提供所在平台的所有特性和接口。C++库简单健壮,提供容器关联数组的支持。


公交车司机终于在众人的指责中将座位让给了老太太