本节简单的给大家说一说 Java 和C语言的关系和发展历程。
首先呢,大家知道,编程语言的发展,其实是经过了三个比较大的阶段阶段,那就是:汇编语言 –> 面向过程语言 ->面向对象语言。
汇编语言由于其难度太大,需要记忆的语句命令过多,但是其对计算机底层的控制和操作能力还是很强大的,由于学习成本太大,效率较低,已经不作为现在计算机系的重点教程了。
C语言可以作为面向过程语言的一种代表,算是一种比较纯正的面向过程语言了。而面向过程的语言也称为结构化程序设计语言,是高级语言的一种。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数。所以说C语言的基本单位也是函数。
面向过程的概念最早由 E.W.Dijikstra 在 1965 年提出,它的主要观点是采用自顶向下、逐步求精的程序设计方法,使用三种基本控制结构构造程序,即任何程序都可由顺序、选择(if-else、switch-case)、循环(for、while、do-while)三种基本控制结构构造。
面向过程语言的最大的优势就是适合模块化设计。一个程序可以分解为多个函数,通过函数调用过程,使得可以用一条函数调用语句实现函数所完成的复杂运算过程。
这种方法使得可以将一个复杂问题的解决过程分解为较为简单的几个子问题的解决过程:
但是当我们在开发新系统诸如此类的问题时,我们开始肯定不清楚这个系统完工后的架构是怎么样的,所以说,利用模块化设计的语言,就很难对开发出来的系统进行调整(或者工作量会很大)。在此类诸多问题的压力下,面向对象语言便体现出了其独一无二的优势。
面向对象语言(OOP, Object-Oriented Programming)是一类以对象作为基本程序结构单位的程序设计语言。Java 便就是面向对象编程中的的一种代表性语言。
C语言 | 19 世纪 70 年代初问世,1978 年美国电话电报公司(AT&T)贝尔实验室正式发布C语言。 |
C++ | 在C基础上,1983 年贝尔实验室推出了 C++。 |
Java | 由 Sun 公司于 1995 年 5 月推出。 |
其实最早,C++ 相对于C语言的基础上就添加了面向对象和模块的思想,这也可以理解成 C++ 中两个加号的来历。
然而,C++ 在面向对象上做的并不是太好,比如 C++ 支持多继承,多继承会引发不确定性(这个后面谈到继承大家就知道了)。
再如,C++ 还支持指针,指针直接对内存底层操作,虽然效率高,危险系数却非常高。例如,一个简单的病毒程序就可以靠指针完成:你通过一个程序的中给指针随机赋值,能够获取到访问不属于本程序执行空间的其他空间的权限,那么这也就是一个计算机病毒。(当然,真正的病毒不可能那么简单,但这是基本特性)。所以后来的 Java 在 C++ 的基础上移除了指针,增加了引用,提高了安全性。
C++ 中,假如你写同样一个程序,在 Java 里面会报错,而在 C++ 语言里面是不会报错的。为什么?
因为 C/C++ 语言设计的思想是:你想怎么写程序就怎么写,只要你的这种写法错得不是很离谱,就认为你这么写有特殊的含义,可以通过。但 Java 不行:只要你这么写有歧义,或者说这样写不太好,那么它都会报错。
比如 C++ 中你可以将一个浮点型数据赋给一个整型变量,编译时只会警告,因为会丢失精度,但是在 Java 中这样写就会报错,它在语法上就禁止你这样写。这就是不同的语言对同样一个问题有不同的理解和处理方式。
由于 C++ 中大大小小的问题会导致不安全性,所以就在 C++ 的基础上,取其精华,去其糟粕,便形成了早期的 Java 语言。直到现在,Java 又多了很多新的特性,比如说集合,反射,泛型,Lambda 表达式等等。
正因为 C -> C++ -> Java 的发展历史,使得 Java 在一定程度上继承了多数C语言的语法,但又有一定的改变。
关于 Java 和C语言的关系,还有 Java 的发展历程,就大概谈到这里,点到为止,正如我前面所说的,如果没有任何(或者只有一点点)编程基础的话,那么请建议先阅读C语言教程,了解编程的基本语法后,再来阅读本教程。
如果有C语言基础(或者至少知道大多数语法规则)的读者,那么当你读完本教程以后,你将会达到 Java EE 的中阶水平。