
1.2 Java与C++、C
随着程序规模的不断扩大,在20世纪60年代末期出现了软件危机,当时的程序设计范型都无法克服错误随着代码的扩大而级数般扩大的问题,这个时候出现了一种新的程序设计范型——面向对象程序设计。
1.2.1 Java和C++
Sun公司的Java开发小组汲取了C++的精华,并将其组合到Java中,舍弃了C++中低效率和不便于程序员使用的特性。Java小组也创造了一些新的特性,给予Java开发基于Internet的应用程序时所必须的动态性。
Java的目的并不是改进C++并最终取代C++。C++和Java这两种语言是设计用来解决不同问题的。Java是用来设计必须共存于不同机器的应用程序——常常是基于Internet的基础之上。相反,C++用来开发在一台特定机器上运行的程序,尽管C++程序被重新编译后也能够在其他机器上运行。
Java语言的许多基本结构与C++是相似的,有时甚至是相同的。例如,Java是一种面向对象编程语言,它用类来创建对象的实例。类具有数据成员和方法成员,这和C++中的类是相似的。
但是Java没有指针,在C/C++编程语言中指针是一个基石。在C++中正确使用指针能使程序富有效率,但是指针难以掌握,如果使用不当会导致运行错误。
Java带有自动的垃圾收集器,这是在C/C++中没有的功能。垃圾收集器是一个常规程序,收集程序中不再使用的内存,程序员不必编写代码来释放之前使用的内存。
在不同的平台上使用C/C++程序使系统会对每种数据类型依平台的不同分配不同的字节数。而在Java中,会为各种数据类型分配合理的固定位数,在每种平台上都不改变,这样便保证了Java的平台无关性。
C++支持多重继承,一个类可以有多个父类,这种方式使C++中的类可以使用多个父类的属性和方法,但结构特别混乱。而在Java中,一个类只能有一个父类,但是可以实现多个接口,这样既达到多重继承的目的,又保证了结构比多重继承更加清晰。
除此之外,与C++不同,Java不支持结构和联合,不支持宏定义,不支持头文件,不支持友元,这大大保证了Java程序的安全性。
1.2.2 Java与C
C语言为面向过程的程序设计语言。面向过程程序设计语言在程序设计过程中都倾向于面向行为。C语言中,程序设计的单元是函数。C编程人员着重于编写函数。执行同一任务的一系列动作构成函数,一系列函数再构成程序。这种语言的主要问题是程序中的数据和操作分离,不能够有效地组成与自然界中的具体事物紧密对应的程序成分。
Java是纯面向对象的程序设计语言,Java语言中程序设计的单元是类,从类中创建一个一个实例对象。Java编程人员着重创建用户自定义的类。每一个类均可包含数据属性和若干操作数据的函数。一个类的函数部分称为方法。C和Java编程与执行过程区别如下。
Windows下C语言开发过程如图1.2所示。C语言程序在执行之前需要把程序编译成机器语言文件,程序执行效率高,依赖专门的编译器,跨平台性差一些。

图1.2 Windows下C语言开发过程
Java语言开发过程如图1.3所示。

图1.3 Java语言开发过程
从图1.2和图1.3的比较中可以看出,Java源程序编译后生成的字节码文件就相当于C源程序编译后Windows上的EXE可执行文件,JVM(Java Virtual Machine)虚拟机的作用类似Windows操作系统。在Windows上运行的是EXE文件,在JVM上运行的是Java字节码文件,即编译后生成的后缀为.class文件。
Windows执行EXE可执行文件的过程,就是从EXE文件中取出一条条的计算机指令,交给CPU去解释执行。字节码并不是机器指令,它不和特定的平台相关,不能被任何平台直接识别、执行。字节码是可以被Java虚拟机识别、执行的代码,即Java虚拟机负责解释、运行字节码,将字节码翻译成所在平台的机器码,并让当前平台运行该机器码。可见,只要能实现特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台上运行,这是Java跨平台的根本。
Java兼顾解释性与编译性语言的特点,Java源文件转换成class字节码文件过程是编译型的,class字节码文件在操作系统上运行的过程则是解释型的,Java虚拟机充当了解释器的作用,C/C++都是编译型的语言,运行速度较快。
延伸阅读:程序设计语言发展脉络
计算机程序设计语言的发展是一个不断演化的过程,从最开始的机器语言到汇编语言再到各种结构化高级语言,最后发展到面向对象程序设计语言。
机器语言是第一代计算机语言,是最原始的编程语言,用二进制代码(0或1)书写,能被机器直接识别。二进制是计算机语言的基础。在计算机发展初期,软件工程师们只能用晦涩的机器语言来编写程序。汇编语言将一个特定指令的二进制串机器指令映射为简洁的英文助记符。例如,用“ADD”代表加法,用“MOV”代表数据传递等。它是比机器语言“高层”的符号语言。高级语言是采用命令或语句的语言,屏蔽了机器的细节问题,提高了语言的抽象层次,正如我们正在学习的Java。