在大学时候买了《Think In java》这本书。最近开始重读,做一个笔记记录,并且谈谈我读这本书的感受。
这本书是由Bruce Eckel,这个人也许不熟悉,但是他的作品可是如雷贯耳啊,Bruce Eckel是MindView公司的总裁,这个公司提供一些软件资讯和培训。他是C++标准委员会拥有表决权的成员之一,拥有应用物理学学士和计算机工程硕士学位。Bruce Eckel从1984年至今,已经发表了超过150篇计算机技术文章,出版了6本书.他的《Thinking in C++》一本书在1995年被评为“最佳软件开发图书”,《Thinking in Java》被评为1999年Java World最受读者欢迎图书
,并且赢得了编辑首选图书奖。
第一章-对象导论
抽象过程
主要介绍oop的由来,计算机来源于机器,作者认为编程语言都提供抽象的机制来解决问题,置于抽象出来的东西就是类型了。
抽象有两种方式,一种是针对计算机内部的结构,比如早期的basic、c语言等,另一种就是针对问题本身,这种方式又衍生出了面向对象的方式。而且oop又和计算机有联系,作者把这种解决问题的对象看成是一个微型计算机,因为它有状态又有操作,用户可以让对象执行这些操作。
java的前生语言smalltalk,有五个基本特征:
- 万物皆对象
为什么这么说呢?作者认为:你可以把一个需要解决的问题,任何具有概念化的东东,都可以定义为对象。
- 程序就是一组对象的集合,对象之间通过发送消息和接收消息来相互通讯的
这个消息是啥呢?就是我对一个对象的方法进行调用,就相当于我对他发送了一个消息。在现实中,就像我对你说了一句话(发送消息),我得先喊你的名字,明确是对你说的呀!
- 每个对象都是由其他对象构成的
原文中,对于这个解释非常绕口,我就从我的角度说一下就行了,你也可以有其他的想法。作者的意思就是对象里面套对象,因此可以创建无线复杂的对象,当然这只是理论上…
- 每个对象都有类型
这个相信大家都懂得,每个对象都是类型class的一个实例。有一点需要注意的是,类与类之间的区别就是“能够发送什么样的消息给它”(谨记)。
- 某一类型的所有对象可以接受同样的消息
这里有两层意思,第一所有对象都是这个类生出来的,所以可以发送相同的消息;另一种情况就是父类-子类概念,比如圆形的对象同时也是一个几何形,作者称之为可替代性(substitutablity)。
最后booch更加简洁的描述了对象:就是状态、行为和标识,就是常说的属性、方法和内存地址(或者名字)。
每个对象都有一个接口
首先作者把我们伟大的哲学家亚里士多德搬出来了,这大哲学家太聪明了,早就看出类型(type)的概念了。敬佩!
作者认为,我们编程的过程就是创建新类型的过程,还有一点,程序都有内置的类型,比如浮点型,我们要面向实际问题中的类型,而不是计算机存储的数据类型。
oop的设计思想就是在问题空间和解空间之间寻找对象的映射关系(这句话比较抽象)。通俗一点解释:要解决问题,就是发生一系列的动作,而这些动作属于某一个对象,比如灯泡这个类型,有开灯这个动作,而这些动作集合就是接口。
这个过程就是向某个对象发消息,比如灯泡这个对象,我可以对他请求开灯、关灯操作。
最后说一下uml统一建模语言:
它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持。UML规范用来描述建模的概念有,类(对象的)、对象、关联、职责、行为、接口、用例、包、顺序、协作,以及状态。
每个对象都提供服务
如果要开发一个程序,就得把问题从表象抽取出来,什么样的对象能够解决我的问题,因此将对象看作是服务提供者,有助于提高对象的内聚性。
被隐藏的具体实现
类创建者需要向程序员暴露必须的部分而隐藏其他的部分,需要隐藏的东西通常来说是一个对象脆弱的部分,容易被修改,并且这部分东西可以被类创建者随意修改,而不会对其他造成影响。
还有重要的一点就是访问控制,允许类内部可以随意更改,而不会对累的使用造成影响,接口与实现相分离,访问控制词如下:
复用具体实现
最简单的复用就是一个类中的成员包含另一个类的对象,使用现有的类合成新的类就叫组合(composition),如果这种组合是动态的就叫聚合(aggregation),是has-a的关系,比如汽车拥有引擎,URL图如下,
继承
继承的UML图用一个空心的三角形表示 。
使用继承主要是使基类和导出类产生差异,有两种方法,
第一,直接在导出类中添加新方法;
第二,覆盖(overriding)
- “是一个”。与“像是一个”关系 要明白一个概念“替代原则”:导出类覆盖基类的方法,拥有完全相同的接口,导出类对象可以完全替代基类对象,称之为“纯粹替代”。
伴随多态的可互换对象
这个小节说的很晦涩,大致意思就是,我们可以用导出类对象直接替换基类对象,但是实际执行的方法到最后运行的时候才能确定,编译期是不确定具体执行哪个对象的代码的。
将导出类看成是基类成为“向上转型”(upcasting),这是“多态”的一种。
单根继承结构
java所有的类型都继承自Object这个类,因此所有对象可以拥有共同的接口,这样操作起来就非常方便,比说垃圾回收器,在堆上创建对象。
容器
下面这段话非常重要: 在解决某个问题时,不知道需要多少个对象,不知道对象存活多久,也不知道需要多少空间来存储这些对象,因为只有在运行时才能知道这些。 好的解决方案就是创建一个容器,比如数组,这个容器只有对所有对象的引用,为什么要选择不同的容器呢? 第一,不同的容器有不同的接口和行为; 第二,不同的容器有些操作有不同的效率;
- 参数化类型 背景就是向下转型和运行时检查都是效率低下的,因为java1.5之前,所有的容器接受的对象都是object类,当从容器中取出某个对象时,就丢失了原来的类型信息,所以需要强制向下转型。 因此需要参数化类型这种机制。
对象的创建和生命期
java中对象是在堆上动态创建的,占用空间以及存活周期在编译期一无所知,只有在运行时才能却定; c++中,对象是在堆栈上手动创建的,占用空间以及存活周期在编译期就可以确定。
异常处理:处理错误
异常也是一种对象,它在出错点就被抛出来,并被处理器所捕获,异常不会被忽略,因此一定会被处理。
并发编程
线程的并发,以及锁
java与internet
- web是什么
- 客户/服务器技术 服务器提供信息,客户机消费信息
- web就是一台巨型服务器
- 客户端编程 这里提到一个概念CGI通用网关接口(common gateway interface),服务器产生静态页面,浏览器进行解释,提交按钮,通过cgi来进行处理。cgi程序的响应时间依赖于发送的数据量、服务器和网络负载。 客户端提交页面,cgi处理完,如果有错误,会返回错误页面重新填写,这个过程不太优雅。 因此我们可以让浏览器做一些事情,因为运行浏览器的机器资源大部分会闲置,所以进行“客户端编程”(实际上就是在浏览器平台上编写程序)
- 插件 程序员下载一段代码,插入到浏览器,添加一些新的功能,因此他为专家级的程序员提供了一个“后门”,可以开发某种语言的扩展程序。
- 脚本语言 脚本语言可以直接嵌入到html页面中,还得需要能够解释这种脚本语言的插件,服务器收到请求时,可以被快速加载,但是缺点是任何人都可以看到脚本语言,不安全。 脚本语言更多的是用来创建更具交互性的页面
- java 通过applet运行在客户端的小程序,作为网页的一部分自动下载,因此在提交表单之前,就可以对日期类型进行校验,从而不用发送到服务器,减少网络流量和服务器负载。 applet没有得到普及的根本原因在于,applet需要的java运行环境,所必须的10M带宽过于恐怖。
- 备选方案 flash
- .NET和C# .NET类似于JRE运行环境,C#相当于java,activeX相当于applet .NET只能运行在windows平台,并不是跨平台
- internet和intranet
- 服务器端的编程 就是在服务器上运行程序,早起是通过perl、Python、C++编写cgi实现的
总结
什么是过程型语言? 就是数据定义和函数调用
好了,本章完结。