编程思想 之「语言导论」

温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋StarFork,纠错。

Java

Java 发展史

Java 是一门面向对象编程语言,它不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。此外,Java 还具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java 语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java 语言缘起于 1991 年 Sun 成立的一个名为 Green 的项目小组,这个由詹姆斯·高斯林、帕特里克、麦克·舍林丹和其他几个工程师一起组成的工作小组在加利福尼亚州门洛帕克市沙丘路的一个小工作室里面研究开发新技术,专攻计算机在家电产品上的嵌入式应用,而这个小组的新技术成果就是 Java 语言的前身,名为 Oak 的面向对象编程语言。

虽然 Oak 是一门不错的面向对象编程语言,但是在随后的几年内,Oak 并没有受到市场的青睐。直到 1995 年,互联网的蓬勃发展给了 Oak 机会,Sun 公司首先推出了基于 Oak 的可以嵌入网页并且可以随同网页在网络上传输的 Applet(一种将小程序嵌入到网页中进行执行的技术),并于同年 5 月将 Oak 更名为 Java,这里还有一个小插曲,在申请注册商标时,由于发现 Oak 已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝一杯 Java 咖啡时无意提到的 Java 词语,Java 语言也就正式诞生。

自 1991 年 1 月 Sun 公司发布 Java 第一个开发工具包(JDK 1.0)至 2017 年 9 月 Oracle 发布 Java SE 9.0 期间,Java 经历了众多的迭代与更新,其中变化最大的一次更新当属 2004 年 9 月 30 日,J2SE1.5 发布,这是 Java 语言发展史上的又一里程碑(第一个里程碑为 1991 年 Sun 发布 JDK 1.0,它标志着 Java 成为了一种独立的开发工具)。为了表示该版本的重要性,J2SE 1.5 更名为 Java SE 5.0(内部版本号 1.5.0),代号为 Tiger,Tiger 包含了从 1996 年发布 1.0 版本以来的最重大的更新,其中包括泛型支持、基本类型的自动装箱、改进的循环、枚举类型、格式化 I/O 及可变参数等。

面向对象

亚里士多德大概是第一个深入研究类型的哲学家,他曾提出过鸟类和鱼类这样的概念。所有的对象都是唯一的,但是同时也是具有相同的特性和行为的对象所归属的类的一部分。在计算机语句的世界中,第一个面向对象的编程语句 Simula-67 就采用了上述的面向对象的思想,它在程序中使用关键字class来引入新的类型,Java 语言同样如此。

虽然 Simula-67 是第一个面向对象的编程语言,但它并不成功。第一个成功面向对象的语言是 Smalltalk ,同时它也是 Java 所基于的语言之一。Alan Kay(他是 Smalltalk 面向对象编程环境语言的发明人之一,也是面向对象编程思想的创始人之一,他还是笔记本电脑最早的构想者和现代 Windows GUI 的最初尝试者)曾总结了 Smalltalk 的五个基本特性,这些特性正是纯粹的面向对象的编程语言所该具有的,包括:

  • 万物皆对象;
    • 这是面向对象编程的终极奥义。
  • 程序是对象的集合,它们通过发生消息来告知彼此所要做的事情;
    • 简单点说,程序中包含不同的对象,对象之间通过调用方法(发送消息)来达到所要实现的具体行为。
  • 每个对象都有自己的由其他的对象所构成的存储;
    • 可以通过创建包含现有对象的方式来创建新的对象。
  • 每个对象都拥有其类型;
    • 每个对象都是某个类的实例,不同的类的区别是就可以接收不同的消息。
  • 某一特定类型的所有对象都可以接收同样的消息。
    • 如 Java 语言中的多态,导出类可以接收任何发给基类的消息。

在理想的面向对象的编程语言中,每个对象都有一个接口(并非绝对,例如我们单纯的想定义一个对象来表示某种类型体系,我们就可以不在对象里面定义接口),我们通过发送消息(调用对象的接口)来告知对象我们要实现什么行为或者动作。反言之,每个对象都提供服务,我们通过想要实现的服务来确定给那个对象发送消息。

相比于「非面向对象编程」的编译器产生的函数调用引起的所谓的「前期绑定」,即编译器产生一个对于具体函数名字的调用,而运行时将这个调用解析到将要执行的代码的绝对地址;「面向对象编程」最重要的地方就是:编译器不可能产生传统意义上的函数调用,而是使用了「后期绑定」的概念,即当向对象发送消息时,被调用的代码直到运行时才能确定。

除上述内容之外,Java 还提供了很多其他的特性供来为我们编程做助力,例如单根(Object)继承体系、容器类、参数化类型(泛型)、高效的对象创建及生命周期(垃圾回收机制)、异常和错误处理、并发编程等。Java 的魅力,并不止于此!


———— ☆☆☆ —— 返回 -> 那些年,关于 Java 的那些事儿 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

通过两个小栗子来说说Java的sleep、wait、notify、notifyAll的用法

线程是计算程序运行的最小载体,由于单个单核CPU的硬件水平发展到了一定的瓶颈期,因此就出现了多核多CPU的情况,直接就导致程序员多线程编程的复杂。由此可见线程...

2448
来自专栏ACM小冰成长之路

KWIC-C/C++实现

吐槽 最近我们 JavaJava 老师不知道为啥非要我用 C/C++C/C++ 来实现 KWICKWIC,但是因为没有上过课,不知道这个东西是干嘛的,所以想网上...

25010
来自专栏CDA数据分析师

震惊小伙伴的Python单行代码

几年前,函数式编程的复兴正值巅峰,一篇介绍 Scala 中 10 个单行函数式代码的博文在网上走红。很快地,一系列使用其他语言实现这些单行代码的文章也随之出现,...

2267
来自专栏编程

浅谈Java学习方法和后期面试技巧 含学习笔记

下面简单列举一下大家学习java的一个系统知识点的一些介绍: 一、java基础部分:java基础的时候,有些知识点是非常重要的,比如循环系列。For,while...

2048
来自专栏程序员互动联盟

C语言和C++区别到底在哪?

作为一个即用过C,也用过C++的人来说,不一定能说出它俩错综复杂的关系。小编也是略懂一二。 简单来说: C++是C发展来的。 C++是面向对象的语言,而C是结...

3518
来自专栏Java学习网

影响Java调用性能有哪些因素

影响Java调用性能有哪些因素 当时发生了什么? 这得从一个小故事说起。我在一个Java核心库的邮件列表中提交了一个修改 ——重写了一些本是 final 的方法...

23910
来自专栏java工会

深度思考编程的艺术

1768
来自专栏java一日一条

重构 改善既有代码的设计--笔记

查看一个类是否“过大”,这里有一个小技巧分享给大家。就是看两点:1)这个类实例变量太多,必然会有Duplicated Code(重复代码) 2)类内如果有太多代...

1124
来自专栏编程

Java 最困扰你的那些事

啊哈Reddit(某知名国外在线问答社区),没了你我们还能在哪里从鱼目混珠的网络中提炼真正的精华?就在这杂乱无章的论坛中,的的确确存在着这样一些精辟的讨论。 比...

2218
来自专栏java一日一条

哪些因素影响Java调用的性能?

这得从一个小故事说起。我在一个Java核心库的邮件列表中提交了一个修改 ——重写了一些本是 final 的方法。一石激起千层浪,这一改动引发了几番讨论。而其中一...

1271

扫码关注云+社区

领取腾讯云代金券