Java编程思想第4版第1章,个人阶段性总结

我打算以总分总的行文结构来写本篇博客。
如果觉得本篇行文太罗嗦,可在目录处点击“文末有彩蛋”,这部分内容是我总结的,说来惭愧。

本篇博客里图片的来源
Java编程思想第4版第1章,个人阶段性总结_第1张图片
所谓“导论”,[introduction]导论也称作引论,是论著正文前概要论述全文或全书的中心思想、创作思路、背景和创作方向的简单概括叙述,以指导帮助读者阅读理解的部分;将涉及内容很广的学科做概括性介绍,一般不会有非常深入的分析,使读者对这门学科有一个概括的了解。

本书书名为《Java编程思想》,Java是一个完全面向对象的语言,因此所谓Java编程就要围绕“对象”展开,所以作者在全书正文部分开门就是“对象导论”,让读者对“对象”有一个初步认识,知道对象理论包括哪些内容。我对本章做出个人小结如下文所示。
在进入第一章之后,第一小节“1.1抽象过程”之前,作者就首先开宗明义,明确指出本章将向读者介绍包括开发方法概述在内的OOP的基本概念。
本章介绍的是背景性的和补充性的材料。了解到对象的重要性,以及怎样使用对象进行设计。

我发现第一章的大约半数的节与本书后边的章能够直接对应,而有些则不能对应。我一直试图去找出为什么?但是空想很困难,直到我绘制出下图,对应关系随着箭头的的建立而变得明确,答案也变得显而易见了。箭头所指,明确的对应关系就没必要赘述了,很显然,先在导论里开个头,到后边具体章里再进行深入研究与讲解。
那么为什么还有这么多节与章没有对应起来呢?
现在这个答案现在也容易寻找了,本章对象导论,主要是介绍OOP的基本概念,尽管后面章标题不能直接体现,但是这些概念是伴随着OOP的始终,比如对象的生命周期。至于后边章标题为什么不能再第一章的节标题里找到直接对应,也容易解释,OOP是一种思想也可被称为理论,而Java作为一门编程语言问世是要解决实际的工程项目问题的,而以James Gosling为首的Java的设计者们,他们是一群工程经验相当丰富的,从James Gosling最初产生要重新设计一门语言去解决当时流行的编程语言存在的弊端或者遗留的问题,到Java问世,再到不断发展到今天的局面,说明Java在被设计的时候,就考虑到许多实际的问题,并给出了自己的解决方案,并且在不断完善。

文章目录

    • 1.1抽象过程
    • 1.2每个对象都有一个接口
    • 1.3 每个对象都提供服务
    • 1.4被隐藏的具体实现
    • 1.5 复用具体实现
    • 1.6 继承
      • 1.6.1 “是一个”与“像是一个”关系
    • 1.7 伴随多态的可互换对象
    • 1.8 单根继承结构
    • 1.9 容器★
      • 1.9.1 参数化类型
    • 1.0 对象的创建和生命期
    • 1.11 异常处理:处理错误★
    • 1.12 并发编程★
    • 1.13 Java与Internet
      • 1.13.1 Web是什么
        • 1. 客户/服务器计算技术
        • 2. Web就是一台巨型服务器
      • 1.13.2 客户端编程
        • 1. 插件
        • 2. 脚本语言
        • 3. Java (applet)
        • 4. 备选方案
        • 5. .NET和C#
        • 6. Internet与Intranet
      • 1.13.3 服务器端编程
    • 1.14 总结
  • 文末有彩蛋

Java编程思想第4版第1章,个人阶段性总结_第2张图片

1.1抽象过程

面向对象的特征:(抽象)、封装、继承、多态
实际上编程起源于抽象,要编程就首先抽象。从最初的汇编语言到面向过程的FORTRAN、BASIC、C等再到面向对象编程的C++、Java等,抽象程度越来越高。尽管抽象性不是面向对象编程独有的特性,但是面向对象编程抽象的结果更具一般性,因此其抽象程度更高。
因此作者从抽象谈起,把抽象过程放在第一章的第一节,并给出结论:

OOP编程,对问题域建模,不会受限于特定的问题,因此OOP的抽象更具一般性。
对象的基本特性:万物皆对象、程序是对象的集合、可发送消息、可分类class、可替代性。对象具有状态、行为和标识。

1.2每个对象都有一个接口

创建抽象数据类型(类)是面向对象程序设计的基本概念之一。
每一个对象都属于定义了特性和行为的某个特定的类(class)。
编程系统欣然接受新的类,并且像对待内置类型一样地照管它们和进行类型检查。

接口确定了对某一特定对象所能发出的请求。但是,在程序中必须有满足这些请求的代码。

作者这句话暗示了,接口与实现类之间的关系。因为还没有讲到接口那一章,所以作者在这里仅仅抛砖引玉一下。其实关于接口在Java中的概念,还是很重要的,因此这里作者并没有明说,留到后续相关章节(第9章 接口)再深入讲解。

1.3 每个对象都提供服务

当正在试图开发或理解一个程序设计时,最好的方法之一就是将对象想像为“服务提供者”。程序本身将向用户提供服务,它将通过调用其他对象提供的服务来实现这一目的。
你的目标就是去创建(或者最好是在现有代码库中寻找)能够提供理想的服务来解决问题的一系列对象。

作者这句“程序本身就是向用户提供服务的”话,非常经典。揭示了编程的出发点与落脚点。而在面向对象编程里,程序就是对象的集合。

将对象看作是服务提供者还有一个附带的好处:它有助于提高对象的内聚性
高内聚是软件设计的基本质量要求之一:这意味着一个软件构件(例如一个对象,当然它也有可能是指一个方法或一个对象库)的各个方面**“组合”**得很好。
人们在设计对象时所面临的一个问题是,将过多的功能都塞在一个对象中。

这里,是“组合”这个词在本书中第一次出现,它出现的那么自然,就好像搭积木很成功。后文中“1.5节复用的实现”才正式给出“组合”的概念顺便也给出了“聚合”的概念。

意义或价值将对象作为服务提供者看待是一件伟大的简化工具,这不仅在设计过程中非常有用,而且当其他人试图理解你的代码或重用某个对象时,如果他们看出了这个对象所能提供的服务的价值,它会使调整对象以适应其设计的过程变得简单得多。

Java编程思想第4版第1章,个人阶段性总结_第3张图片

1.4被隐藏的具体实现

访问控制的存在原因:
1、程序员分工合作,划分责任边界,保证数据安全。
2、内部实现可调整从而可优化,而内部结构变化,边界外无感知无影响。
Java用三个关键字在类的内部设定边界:public、private、protected 以及包访问权限。

这里引出“访问控制权限”与第6章相对应。

1.5 复用具体实现

代码复用是面向对象程序设计语言所提供的最了不起的优点之一。
因为是在使用现有的类合成新的类,所以这种概念被称为组合(composition)。
如果组合是动态发生的,那么它通常被称为聚合(aggregation)。
组合经常被视为 “has-a”(拥有)关系,就像我们常说的"汽车拥有引擎"一样。
组合带来了极大的灵活性。……
实际上,在建立新类时,应该首先考虑组合,因为它更加简单灵活。

所谓复用,面向对象提出继承就是为了代码可重用,但是并不是什么时候都要用继承,毕竟有时候太复杂的继承结构并不一定合适。在实际的项目中,组合用的更多,因为组合更灵活。

1.6 继承

类型不仅仅只是描述了作用于一个对象集合上的约束条件,同时还有与其他类型之间的关系。类型层次结构同时体现了几何形状之间的相似性和差异性。
通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛。
有两种方法可以使基类与导出类产生差异。
第一种方法非常直接:直接在导出类中添加新方法。
第二种是改变现有基类的方法的行为,这被称之为覆盖(overriding)那个方法。

1.6.1 “是一个”与“像是一个”关系

纯粹替代,通常称之为替代原则。(is-a)
有时必须在导出类型中添加新的接口元素,这样也就扩展了接口。is-like-a(像是一个)

1.7 伴随多态的可互换对象

编写出不依赖于特定类型的代码。
函数调用→后期绑定:编译期编译期只要确定该方法存在即可,运行时JVM动态计算代码的地址。Java编译器的动态绑定是默认行为,不像C++那样需要virtual关键字修饰。
向上转型:基类引用指向导出类对象。

[第8章 多态,更深入更详细]

Java编程思想第4版第1章,个人阶段性总结_第4张图片

1.8 单根继承结构

在Java中,所有的类最终都继承自单一的基类——Object。
事实证明, 单根继承结构带来了很多好处。

  • 单根继承结构保证所有对象都具备某些功能。
  • 所有对象都可以很容易地在【堆】上创建,而【参数传递】也得到了极大的简化。
  • 单根继承结构使【垃圾回收器】的实现变得容易得多,而垃圾回收器正是Java对C++的重要改进之一。这对于系统级操作(如异常处理)显得尤其重要,并且给编程带来了更大的灵活性。

1.9 容器★

数组

容器对象持有对其他对象的引用。[详见第11章 持有对象]
幸运的是,好的OOP语言都有一组容器,它们作为开发包的一部分。Java中,具有满足不同需要的各种类型的容器,例如List(用于存储序列),Map(也被称为关联数组,用来建立对象之间的关联),Set(每种对象类型只持有一个),以及诸如队列、树、堆栈等更多的构件。[详见第17章 容器深入研究]
还是需要对容器有所选择,这有两个原因。
第一,不同容器提供了不同类型的接口和外部行为。
第二,不同的容器对于某些操作具有不同的效率。

1.9.1 参数化类型

本节对应第15章泛型
第1.7节 多态里提到了向上转型

那么创建这样的容器,它知道自己所保存的对象的类型,从而不需要向下转型以及消除犯错误的可能,这样不是更有意义吗?这种解决方案被称为参数化类型机制。
参数化类型就是一个编译器可以自动定制作用于特定类型上的类。
Java SE5的重大变化之一就是增加了参数化类型,在Java中它称为范型。

一对尖括号,中间包含类型信息,通过这些特征就可以识别对范型的使用。
例如,可以用下面这样的语句来创建一个存储Shape的ArrayList:
ArrayList shapes = new ArrayList();

1.0 对象的创建和生命期

在使用对象时,最关键的问题之一便是它们的生成和销毁方式。
每个对象为了生存都需要资源,尤其是内存。
当我们不再需要一个对象时,它必须被清理掉,使其占有的资源可以被释放和重用。
Java完全采用了动态内存分配方式,即堆(heap)的内存池中动态地创建对象。
**动态方式有这样一个一般性的逻辑假设:**对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大冲击。动态方式所带来的更大的灵活性正是解决一般化编程问题的要点所在。
Java提供了被称为“垃圾回收器的机制,它可以自动发现对象何时不再被使用,并继而销毁它。Java的垃圾回收器被设计用来处理内存释放问题(尽管它不包括清理对象的其他方面)。垃圾回收器“知道”对象何时不再被使用,并自动释放对象占用的内存。
这一点同所有对象都是继承自单根基类Object以及只能以一种方式创建对象(在堆上创建)

1.11 异常处理:处理错误★

本节对应第12章 通过异常处理错误。

自从编程语言问世以来,错误处理就始终是最困难的问题之一。
异常处理就像是与程序正常执行路径并行的,在错误发生时执行的另一条路径,它不会干扰正常的执行代码。异常不能被忽略,所以它保证一定会在某处得到处理。
最后需要指出的是:异常提供了一种从错误状况进行可靠恢复的途径。
Java的异常处理在众多的编程语言中格外引人注目,因为Java一开始就内置了异常处理,而且强制你必须使用它。
值得注意的是,异常处理不是面向对象的特征——尽管在面向对象语言中异常常被表示成为一个对象。
异常处理在面向对象语言出现之前就已经存在了。

Java编程思想第4版第1章,个人阶段性总结_第5张图片

1.12 并发编程★

本节对应第21章 并发。

在计算机编程中有一个基本概念,就是在同一时刻处理多个任务的思想。
通常,线程只是一种为单一处理器分配执行时间的手段。
所有这些都使得并发看起来相当简单,但是有一个隐患:共享资源
为了解决这个问题,可以共享的资源,例如打印机,必须在使用期间被锁定
因此,整个过程是:某个任务锁定某项资源令完成其任务,然后释放资源锁,使其他任务可以使用这项资源。
Java的并发是内置于语言中的,Java SE5已经增添了大量额外的库支持。

1.13 Java与Internet

Java之所以能够大行其道,是因为它解决了在万维网(WWW)上的程序设计问题。

1.13.1 Web是什么

1. 客户/服务器计算技术

客户/服务器计算技术存在的问题:

  1. 只有单一的服务器,却要同时为多个客户服务。通常,这会涉及数据库管理系统。
    因此设计者把数据“均衡”分布于数据表中,以取得最优的使用效果。
  2. 既然必然涉及数据库,那么也就不得不考虑事务处理
  3. 最后还有一个最重要的性能问题:可能在任意时刻都有成百上千的客户向服务器发出请求,所以任何小的延迟都会产生重大影响。
    程序员努力减轻处理任务的负载,通常是分散给客户端机器处理,中间件也被用来提高可维护性。
    因此,整个客户/服务器问题需要彻底解决。

2. Web就是一台巨型服务器

Web实际上就是一个巨型客户/服务器系统。人们希望实现完整的客户/服务器能力,使得客户可以将信息反馈给服务器。
首先,图形标准得到了增强,使得在浏览器中可以播放质量更好的动画和视频。
剩下的问题通过引入在客户端浏览器中运行程序的能力就可以解决。
这被称为“客户端编程”。

1.13.2 客户端编程

建于CGI程序之上的网站可能会迅速变得过于复杂而难以维护,并同时产生响应时间过长的问题。Web的最初设计者们并没有预见到网络带宽被人们开发的各种应用迅速耗尽。问题的解决方法就是客户端编程
客户端编程意味若Web浏览器能用来执行任何它可以完成的工作,使得返回给用户的结果更加迅捷,而且使得你的网站更加具有交互性。
它与通常意义上的编程十分不同,参数几乎相同,而平台却不同。Web浏览器就像一个功能受限的操作系统。
客户端编程的问题和方法概述如下。

1. 插件

插件提供了一个“后门” ,使得可以创建新的客户端编程语言

2. 脚本语言

插件引发了浏览器脚本语言(scripting language)的开发。
JavaScript→ECMAScript
脚本语言可以解决客户端编程中所遇到的百分之八十的问题。

3. Java (applet)

Java是一种功能强大的、安全的、跨平台的、国际化的编程语言,而且它还在不断地被扩展,以提供更多的语言功能和类库,能够优雅地处理在传统编程语言中很难解决的问题,例如并发、数据库访问、网络编程和分布式计算。
Java是通过applet以及使用Java Web Start来进行客户端编程的。

4. 备选方案

在“图形化用户界面”一章中,我们将看到一种折中的新技术,Macromedia的Flex,它允许你创建基于Flash 的与applet相当的应用。
对于客户端编程而言,这是一种值得考虑的备选方案。

5. .NET和C#

.NET平台大致相当于Java虚拟机(JVM,即执行Java程序的软件平台)和Java类库。这是自从Java出现以来,Java所碰到的真正的竞争。
但是,在该实现完成及微软不会排斥其中的任何部分之前,.NET作为一种跨平台的解决方案仍旧是一场高风险的赌博。

6. Internet与Intranet

Web是最常用的解决客户/服务器问题的方案
当Web技术仅限用于特定公司的信息网络时,它就被称为Intranet(企业内部网)。
当面对各种令人眼花缭乱的解决客户端编程问题的方案时,最好的方法就是进行性价比分析。
认真考虑问题的各种限制,然后思考哪种解决方案可以成为最短的捷径。
既然客户端编程仍然需要编程,那么针对自己的特殊应用选取最快的开发方式总是最好的做法。
为那些在程序开发中不可避免的问题提早作准备是一种积极的态度。

1.13.3 服务器端编程

服务器端编程的话题,它是Java已经取得巨大成功的因素之一。
更复杂的对服务器的请求通常涉及数据库事务。
这些数据库请求必须通过服务器端的某些代码来处理,这就是所谓的服务器端编程。
服务器端编程的话题在《企业Java编程思想》(Thinking in Enterprise Java)一书中有所论述。

1.14 总结

OOP,你看到的只是有关下面两部分内容的定义:
用来表示问题空间概念的对象以及发送给这些对象的用来表示在此空间内的行为的消息
面向对象程序设计带给人们的喜悦之一就是:对于设计良好的程序,通过阅读它就可以很容易地理解其代码。因为许多问题都可以通过重用现有的类库代码而得到解决。
OOP和Java也许并不适合所有的人。
重要的是要正确评估自己的需求,并决定Java是否能够最好地满足这些需求,还是使用其他编程系统(包括你当前正在使用的)才是更好的选择。

文末有彩蛋

绍包括开发方法概述在内的OOP的基本概念。
本章介绍的是背景性的和补充性的材料。了解到对象的重要性,以及怎样使用对象进行设计。

1.1 作者从编程的起源——抽象谈起:语言越高级,抽象度越高。OOP针对问题域抽象,这就是抽象过程的结果。

1.2为什么第一节要讲“抽象过程呢”?抽象在OOP里要落地啊,创建抽象数据类型(类)是面向对象程序设计的基本概念之一,对象要被分类要不然就是对象之间的关系就是杂乱无章的。
接口确定了对某一特定对象所能发出的请求。但是,在程序中必须有满足这些请求的代码。每个对象都有一个接口,这样该对象只能收到针对该接口的请求,否则就乱套了。

1.3 上一节提到接口确定了对某一特定对象所能发出的请求。所谓对象接受请求不就是要为请求者提供服务吗。因此,每个对象都提供服务。此外,好处还能提高对象的内聚性(软件设计的基本质量要求之一),还便于理解使设计过程变得简单的多。

1.4 被隐藏的具体实现 个人拙见:【对象提供服务,但并不意味着被客户端操纵服务,因此,为了数据安全需要访问控制权限】

1.5 复用具体实现[实际上,在建立新类时,应该首先考虑组合(has-a),因为它更加简单灵活。]

1.6 继承 面向对象特征之一,直接目的就是为了代码可重用。从“继承”以此很容易首先想到相似性,因为是相似不是相同,所以同时相似性本身就蕴含着差异性。造成差异的方式[添加新元素、覆盖(overriding]
1.6.1 “是一个”与“像是一个”关系【纯粹替代,通常称之为替代原则。(is-a);扩展了接口。is-like-a(像是一个)】

1.7 伴随多态的可互换对象多态一开始让人很难理解,但是联想到对象的五个基本特性的最后一个特性【可替代性】,就知道多态体现了对象的可替代性。
多态的目的:编写出不依赖于特定类型的代码。
多态的实现原理:后期绑定。其中Java编译器的动态绑定是默认行为。
多态的过程:向上转型。

1.8 单根继承结构【Object】带来了很多好处,其中:单根继承结构使【垃圾回收器】的实现变得容易得多。

1.9 容器★持有对象、List、Set、Map
1.9.1 参数化类型 泛型

1.0 对象的创建和生命期
Java完全采用了动态内存分配方式,即堆(heap)的内存池中动态地创建对象。
Java提供了被称为“垃圾回收器”的机制,它可以自动发现对象何时不再被使用,并继而销毁它。

1.11 异常处理:处理错误★自从编程语言问世以来,错误处理就始终是最困难的问题之一。
异常不能被忽略,所以它保证一定会在某处得到处理。
异常提供了一种从错误状况进行可靠恢复的途径。
Java一开始就内置了异常处理,而且强制你必须使用它。

1.12 并发编程★并发编程是一个热点话题在此不做深究,留到第21章。
Java的并发是内置于语言中的,Java SE5已经增添了大量额外的库支持。

1.13 Java与Internet
Java之所以能够大行其道,是因为它解决了在万维网(WWW)上的程序设计问题。

1.13.1 Web是什么

  1. 客户/服务器计算技术
    存在问题:1)数据是否均衡分布;2)涉及数据库事务处理;3)性能瓶颈。
  2. Web就是一台巨型服务器

    1.13.2 客户端编程客户端编程意味若Web浏览器能用来执行任何它可以完成的工作,使得返回给用户的结果更加迅捷,而且使得你的网站更加具有交互性。
    它与通常意义上的编程十分不同,参数几乎相同,而平台却不同。Web浏览器就像一个功能受限的操作系统。
  3. 插件[后门]
  4. 脚本语言[JavaScript→ECMAScript]
  5. Java (applet)
  6. 备选方案[Macromedia的Flex]
  7. .NET和C#[Java所碰到的真正的竞争。]
  8. Internet与Intranet[最短的捷径]

1.13.3 服务器端编程服务器端编程的话题,它是Java已经取得巨大成功的因素之一。
服务器端编程的话题在《企业Java编程思想》(Thinking in Enterprise Java)一书中有所论述。

1.14 总结
OOP,你看到的只是有关下面两部分内容的定义:用来表示问题空间概念的对象以及发送给这些对象的用来表示在此空间内的行为的消息。
要正确评估自己的需求

你可能感兴趣的:(【文摘】Think,In,Java编程思想(第4版))