Java咖啡馆07——大话面向对象

原创 2004年08月14日 07:15:00

归根结底,计算机的发展史可以归纳为“抽象”两个字。应用存储程序的理论,人们从最早的现代计算机抽象出软件(Software)和硬件(Hardware)两个独立部分。为了让软件各司其职,软件又被抽象成专门与硬件打交道的操作系统(Operating System)和建筑在操作系统之上的应用软件(Application)。数据处理又是许多应用软件必须的前提,从而抽象出数据库系统(Database System)。到了网络时代,为了更好地适应网络软件的开发,应用软件中又抽象出应用服务器(Application Server)提供各种服务。

编程语言的发展亦复如是。让我们在这回的咖啡馆中看看编程语言的发展简史,从头认识Java中的面向对象编程技术。

一、前世

1946年2月15日,随着第一台现代电子计算机ENIAC轰鸣着来到这个世界,编写程序也成为三百六十行之外的一个崭新职业。我们称编写程序的工程师为程序员或者开发者。

ENIAC是一台重达30吨的庞然大物,由19000多个晶体管、1500多个继电器组成。为了给它下达指令,程序员必须通过不同的连接线组合进行编程。要编制运行新的程序,还必须拔掉连线重新来过。整天面对二进制编程的工作相当枯燥乏味,而且是直接对程序地址读写,自然出错频繁。阅读由连线表达的程序更不亚于揣摩天书,维护和改造程序的价格成本居高不下。更要命的是,早期的计算机制造价格相当昂贵,而在程序编制调试完成之前,计算机不得不一直空转,导致软件开发的费用竟然远远超过硬件的投入。

为了解决软件开发的难题,计算机科学家发明了汇编语言,通过一些助记符来减轻二进制编码的开发压力。这的确是行之有效的方法,直到现在,程序员在开发中还常常使用嵌入式汇编来提高软件运行速度,游戏引擎更是如此。然而,汇编语言太依赖程序员的素质,而且无法适应大规模的开发。

黄糖故事 Grace Murray Hopper、Bug和Debug

由于一次传奇般的投资,Mark I计算机把IBM从生产制表机、肉铺磅秤、咖啡碾磨机等乱七八糟玩意的行业,领入了计算机制造业的领地,最终成为如今的蓝色巨人。女数学家Grace Hopper是Mark I三个程序员之一,也参与了Mark II的研发。有一天,她在调试程序时出现了故障。经过反复检查,Hopper发现她程序的逻辑并没有错误,不得已拆开继电器逐个检查。不出所料,原来是一只飞蛾(moth)被夹扁在触点中间,从而造成了死机。Hopper把这只飞蛾的尸体夹在管理日记里面,并且写到:第一次发现Bug。自此以后,浪漫的程序员便把程序故障统称为Bug,后来逐渐成为计算机领域的行话。而调试程序除错,就叫Debug,你可以在Eclipse里面找到这种运行模式。

说起这位Hopper女士,实在是一个不得了的人物。1952年,Hopper觉得用机器码编程是不是比较原始,为什么不能用类自然语言编写程序,然后再用一个工具把它转换成机器码呢?不久,她就开发出世界上第一套编译器A-0,是现代编译技术的原型。1956年她在第一台储存程序的商业电子计算机UNIVAC I、II上开发出B-0,之后叫做FLOW-MATIC,它导致了计算机商用语言COBOL(COmmon Business Oriented Language)的诞生。虽然Hopper有着“电脑之母”的美誉,但是传说她办公室有一个倒着走的钟,以及一面秀着骷髅头的海盗旗。■

到了60年代,以FORTRAN (FORmula TRANslating)、COBOL、LISP、ALGOL 60等现代高级语言的出现了。程序员可以用接近自然语言的程序语言编制软件,然后通过编译器转换成机器可执行的代码。由于使用精确的形式语言来定义程序语言本身,并且通过对硬件的抽象使得程序与计算机平台无关,导致高级语言生产效率大大提高,维护费用自然降低不少,计算机软件业终于得以蓬勃发展。

好景不长。随着软件大规模的应用,程序的开发方法和管理手段逐渐无法跟上软件规模的膨胀,从而导致了软件危机的出现。就拿1963-1966年间的IBM 360系统来说,该系统有100 万行的代码量,IBM每年动用5000人来维护该系统,但是,每个版本都是从上一个版本找出1000以上个错误而修订的结果,好像越改错误越多,根本没有改善的迹象。有人把IBM 360系统形容为一只逃亡的野兽落到泥潭中做垂死的挣扎,越是挣扎,陷的越深,最后仍然无法逃脱灭顶的灾难。

人们不得不停下脚步思考,到底哪里出了问题。回想自己,每个人做事情,都是列举重点,然后细化并逐个完成。比如制造自行车,肯定是先把自行车按照功能分块,先造车架,然后是两个车轮,接着是踏板等传动装置,最后才是坐垫、车铃等零件。而制造车轮,肯定是要分别制造钢圈、钢丝、轮胎,而轮胎有分内外胎。如果软件开发能够遵循这种从大到小、逐步精确的思想,是不是能够解决这个软件危机呢?

没错,这种结构化的抽象分析方法,导致了结构化程序设计方法的诞生。

黄糖故事 Niklaus Wirth和PASCAL

凡是学过一点计算机知识的人大概都知道“数据结构+算法二程序”这一著名公式。提出这一公式的瑞士计算机科学家Niklaus Wirth由于发明了多种影响深远的程序设计语言,并提出结构化程序设计这一革命性概念而获得了1984年的图灵奖。

Wirth开发的PASCAL在数据结构和过程控制结构方面都有很多创造,比如Java中字符型、引用型,以及if-then-else、while、for等多种控制结构,都是从PASCAL里面借鉴发展而来的。可以说,现代程序设计语言中常用的数据结构和控制结构绝大多数都是由PASCAL语言奠定基础的,因此PASCAL在程序设计语言的发展史上具有承上启下的重要里程碑意义。■

1971年,Wirth基于其开发程序设计语言和编程的实践经验,首次提出了“结构化程序设计”(structured programming)的概念。这个概念的要点是:不要求一步就编制成可执行的程序,而是分若干步进行,逐步求精。第一步编出的程序抽象度最高,第二步编出的程序抽象度有所降低……最后一步编出的程序即为可执行的程序。用这种方法编程,似乎复杂,实际上优点很多,可使程序易读、易写、易调试、易维护、易保证其正确性及验证其正确性。结构化程序设计方法又称为“自顶向下”或“逐步求精”法,在程序设计领域引发了一场革命,成为程序开发的一个标准方法,尤其是在后来发展起来的软件工程中获得广泛应用。有人评价说沃思的结构化程序设计概念“完全改变了人们对程序设计的思维方式”,这是一点也不夸张的。

黄糖故事 Philippe Kahn的Borland传奇

Wirth开发PASCAL的初衷是为了有一个适合于教学的语言。但一经推出,由于它的简洁明了、提供丰富的数据结构和控制结构,使得程序开发大为简便,竟然大受欢迎。在C语言问世以前,PASCAL是风靡全球、最受欢迎的语言之一,不但创下了发行拷贝数最多的世界记录,而且成为大学数据结构教学的“唯一官方指定”语言。

Phillipe Kahn是Niklaus Wirth的学生,毕业后到美国加利福尼亚州创立了Borland公司,凭借拳头产品Turbo PASCAL,当时就卖出了100多万个拷贝,成为百万富翁。而Borland公司是程序员津津乐道到程序开发工具供应商,他们从最早的Turbo PASCAL、Turbo C、Turbo PROLOG等Turbo系列,到如今的Delphi、C++ Builder、JBuilder、C# Builder系列,无一不是举足轻重的开发工具,从而在开发者心目中有着崇高的地位。■

二、今生

虽然结构化程序设计使得程序员世界观经历了巨大变革,行之有效地解决了软件开发中的许多问题,然而,结构化程序设计并不能完全解决软件危机,人们仍然渴望生产效率更高、更可靠、易维护、易管理的开发思想和开发方法。

实际上,人们认识世界,是有一些基本的法则的:

  • 区分事物及其属性,如自行车和车子的颜色。
  • 区分整体对象及其组成部分,如区分自行车和车轮。
  • 不同对象类的形成及其区分,如山地自行车和两人休闲车虽然有相当的区别,但都属于自行车这个类型。

心理学研究表明,把客观世界由许多对象组成,对象具有其属性和行为,之间存在着各种联系,这样能够更好的刻画问题域,也更接近人类的自然思维方式。这就是面向对象程序开发思想的由来。

对象的概念最早出现于50年代人工智能的早期著作中,而OO的实际发展始于1966年的Kisten Nygaard和Ole-Johan Dahl开发的Simula语言。正如名字昭示的,Simula可以模拟客观世界。比如在著名的银行出纳问题中,你可以创建若干个出纳员对象,若干个客户对象,还有若干钱对象以及交易对象(即把存款、提款等交易动作看成一个对象)—— 这个世界是由对象组成的。所有出纳员对象,除了各自的状态不同,都是属于的出纳员这个抽象类别。出纳员对象和客户对象之间通过消息传递进行交互,并且最终生成若干个交易对象,而交易对象可以操纵钱对象,完成存款或者提款的动作。

你看,这个银行柜台世界,是不是完全可以由对象模拟呢?从而,面向对象设计程序,主要就是设计抽象的类。

面向对象程序设计思想是一个里程碑。Alan Kay设计了世界上第一个完全面向对象的语言Smalltalk并成为图灵奖得主,Bjarne Stroustrup明智地把面向对象和最流行的C语言结合而开发了有史以来取得最大成功的C++语言,Anders Hejlsberg把PASCAL的面向对象版本Object PASCAL结合构件的思想开发出Windows平台上最优秀的快速程序开发(RAD)工具Delphi,James Gosling结合Internet背景开发了本咖啡馆赖以谋生计的Java语言,Bill Gates把.Net体系结构完全构筑在面向对象之上……

黄糖故事 “面向对象”与“物件導向”

阅读台湾技术作家的文章时经常会遇到“物件導向”一词。实际上,这是港澳台地区的计算机科学家对“Object Oriented”的翻译,与我们所说的“面向对象”是一回事情。不过,如果仔细从OO的理念品评一下两者的味道,似乎“物件導向”这个翻译更雅,更原汁原味。

虽然面向对象只是从语法上引入为面向对象服务的封装、继承、多态等概念,但是必须看到,OO并非一种特殊的规定或者行业规范,而是一个优秀的理念,学习Java,应该把OO当作指导思想。

大话设计模式之面向对象基础篇(三)

人一旦想要偷懒,创造力就是无穷的,愈发得感觉面向对象中的一切知识都是打着高效敏捷的口号进行的掩盖偷懒行为的冠冕堂皇的借口……...
  • sun15732621550
  • sun15732621550
  • 2015年11月29日 13:10
  • 1006

大话设计模式之面向对象基础

在UML的视频学习过程中,虽然从宏观上见识了一下面向对象技术的魅力(UML学习之面向对象技术)还不知道怎么与代码发生联系,现在已经敲了6个设计模式了,终于能够稍微理解一下它的神奇。其实这些模板和设计模...
  • wlccomeon
  • wlccomeon
  • 2013年02月26日 23:06
  • 1399

java 面向对象概念

java 面向对象概念 封装 继承 多态 抽象
  • mappp
  • mappp
  • 2016年07月19日 10:59
  • 2574

java面向对象--07

继承继承: 1,提高代码的复用性 2,继承让类与类之间产生了关系,有了这个关系,才有了多态的特性。 注意: 不可以为了简化代码,获取其他类的功能无脑继承 必须有所属关系才可以继承。class...
  • java19930623
  • java19930623
  • 2015年07月25日 17:41
  • 186

超级容易理解!!!Java的面向对象思想———类与对象。

在初学者学Java的时候,面向对象很难让人搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧。 首先我们来简单的阐述面向对象的思想。 面向对象: 官方的语言很抽象,我们把官方的...
  • a907691592
  • a907691592
  • 2016年06月07日 16:17
  • 13284

学习java中面向对象的一些小总结。

Java面向对象 面向对象三大特征:封装、继承、多态   封装:1.提高数据的安全性。 2.操作简单 3.隐藏了实现 使用private修饰需要封装的属性,用set和get设置和获取属性。   构造函...
  • xs_challenge
  • xs_challenge
  • 2016年11月17日 20:13
  • 831

JAVA面向对象知识点详解

一、类和对象 类:类是对对象的一种抽象描述,也就是说,类其实就是定义对象的一个模板,在这个模板里面充分描述了对象所具有的属性和行为(方法)   对象:通过类具体创建出来的实体,就是对象,这些对象...
  • xxf159797
  • xxf159797
  • 2016年12月15日 14:13
  • 348

Java面向对象的三个特征与含义(封装 继承 多态)

三大特征是:封装、继承和多态。 封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公布给其它对象。在java中能使用private、pro...
  • GS_008
  • GS_008
  • 2016年03月22日 01:15
  • 2310

深入理解Java中的面向对象

深入理解Java中的面向对象
  • a2011480169
  • a2011480169
  • 2016年08月03日 09:13
  • 4438

java入门、java学习:如何理解Java面向对象

首先要说明一点,对象不是java的,事实上他只是一种概念,一种用于解决问题的程序设计的思想方法。要理解对象就必须得要和面向对象结合起来。在面向对象中把某一类事物所共有的属性和行为抽象出来之后就形成了一...
  • javaniuniu
  • javaniuniu
  • 2016年05月23日 10:59
  • 1891
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java咖啡馆07——大话面向对象
举报原因:
原因补充:

(最多只允许输入30个字)