《面向对象java编程思想》笔记

Chapter 1 面向对象的思想
1.1观察世界的一种方式
1.1.1代理和团体
一个面向对象的程序是由一个相互作用的代理团体组成,这些代理被称为对象,每一个对象都承担一个角色,每一个对象都提供一种服务或执行一种动作,以便为团体中其他对象服务。
1.1.2消息与方法
消息传递过程的一个重要原则:信息隐藏。不需要关心请求是如何执行的,只需找到能执行请求的对象即可。(在使用可重用组件时重要的就是无条件相信别人编写的软件)
消息传递与过程调用的不同:
1) 消息传递必须有指定的接收者(消息所发送给的某些对象);过程调用,没有指定接收者
2) 对消息的解释依赖于接收者,会因接收者的不同而不同
后期绑定:运行时才能将消息(函数或者过程名)与响应消息的代码段(方法)相绑定的机制
1.1.3责任
责任:用来描述行为。当用责任去描述某一问题时,得到更高一层的抽象。这允许对象之间具有更大的独立性。与对象有关的所有责任集合被称为协议。
从传统的、结构化的角度看软件与从面相对象角度看软件的差别:
不要问你能为你的数据结构做些什么,而是要去问你的数据结构能为你做什么
1.1.4类和实例
所有的对象都是某个类的实例。对象响应消息所调用的方法由接收者类决定。给定类的所有对象都使用相同的方法来响应相似的消息。
1.1.5类层次结构——继承
可以把类组织成层次继承结构。子类将继承它上部父类的所有属性(非私有)。抽象父类不能有自己直接的实例(比如抽象动物类,实例是什么呢?);它只用于创建子类。
Chapter 3 面向对象的设计
 责任驱动设计:一种责任规范和分配的设计技术。
 设计过程要从分析行为开始:对系统行为的理解通常要比别的方面早得多。
 RDD(责任驱动设计)案例分析(交互式智能厨房助手)
 聚合(cohesion):有意义单个组件责任的度量(要得到高聚合,可以在单个组件中关联某种方式下相关的任务。任务相关联的最常见的方法就是利用其访问共同数据的必要性)
 耦合(coupling):描述软件组件之间的关系。(一般来说,应尽量降低组件的耦合度,因为软件组件之间的联系不利于开发、修改或者复用。把任务分解为拥有所需数据的组件的一系列责任,通常可以避免耦合度提高)
Chapter 8 理解继承
8.2 Object基类
在java中,所有的类都使用了继承。除非特别指定,否则所有的类父类是Object类。如果没有明确指定父类,则隐含的父类就是Object类
Oblect类的几种方法:
 Equals(Object obj)用于判断参数中的对象与接收者对象是否相同(注意与“==”的区别)。
 getClass()返回接收者的类
 hashCode()返回此对象的散列值。如果equals方法被覆盖,此方法也应该被覆盖
 toString()把对象值转换成子串值
8.3子类化、子类型和可替换性
可替换性:变量在声明时指定的类型不必与它所容纳的值得类型相一致。
Object类型的变量可以容纳除了基本数据类型之外的任何值(Object是所有对象的父类)。向量类使用了这一特性,它用Object类型的数组来容纳数据,因此向量可用于容纳任何类型的对象值。
当使用继承从已有的类构建新类时,判断可替换性是否合法的依据:
 子类实例必须拥有父类的所有数据字段
 子类必须实现父类所定义的所有功能,最起码要通过继承来实现
 在相似的条件下,使用子类实例来替换父类实例时,应该没有区别(子类的实例可以模拟父类的行为)。(ps:考虑继承的所有使用条件后这一条不总是正确的)
子类型:用于描述能明显满足可替换性原则的类之间的关系。
8.4继承的形式
特殊化:子类是父类的一个特例。
规范化:父类中定义的行为需要在子类中实现,而父类本身没有实现这些行为(接口)
构造:子类利用父类提供的行为,但并不是父类的子类型。在java标准类库中,Stack类是通过继承向量类来构建的。
扩展:子类添加了一些功能,但并没有改变继承来的行为
限制:子类限制了一些来自父类的方法的使用。
合并:子类从多个父类中继承特性,java不支持多继承但是可以通过接口来实现。
8.5修饰符和继承
一个静态(static)字段可以由类的所有实例所共享,静态方法可以在创建类的实例前被调用,静态的数据字段和方法与非静态条目一样被继承,只是静态方法不能被覆盖。
Abstract修饰的类不能实例化,修饰的方法要覆盖。
Final修饰的类不能子类化,修饰的方法不能被修改
8.7继承的好处
 软件可重用性
 增加的可靠性
 代码共享
 接口的一致性
 软件组件
 快速原型化(不太明确系统的目标和需求用这种编程技术较好)
 多态性和框架
 信息隐藏
8.8继承的代价
 执行速度
 程序的大小
 消息传递的开销
 程序的复杂性
Chapter 10 软件复用机制
10.1 可替换性
10.1.1“是一个”和“有一个”规则
是一个关系表示第一个对象是第二个对象的特例。从实践意义上讲,更特定对象的数据和行为是更抽象对象的数据和行为的子集。
有一个关系表示第二个对象是第一个对象的组成部分
10.1.2代码继承和行为继承
两个概念能共享一个结构或代码关系时,选择继承机制 。
能共享行为规范,而不是共享实际的代码时,接口机制就是一种更合适的技术。
10.2合成与继承的描述
软件复用的两种不同机制:合成与继承分别对应有一个和是一个规则
两者的比较:
 即使没有明确指出,继承也隐含了可替换性。使用合成机制时不存在这种可替换性假设
 合成相对简单,能清楚地表明数据类型能执行哪些操作
 使用继承来创建新类时,新类的操作是父类操作的超集。为明白新类都有哪些操作,程序员需看父类都定义了哪些操作
 继承创建的新类比较简洁
 继承不会阻止用户使用父类的方法来操作新类
 通过继承构建的组件可以访问父类中声明为protected的字段和方法,而合成只能访问public特性
 继承允许我们在已有的多态方法中把新类作为参数,由于合成不具有可替换性,因此它不支持多态性
 这两种机制在可理解性和可维护性方面很难判断优劣。继承具有代码简洁,但不是协议。使用合成构建的代码虽长一点,但这是使用此类的程序员唯一需了解的代码
 通过继承实现的数据结构在执行时间上稍快一点,省去了方法调用
Chapter 14 输入输出流
14.1 流、Reader、Writer
流:从最低的层面上看,流是一种用于发送和接收8个二进制位值的管道。
Reader类Writer类用于读写16位的Unicode字符值。
14.2 输入流
 物理输入流(从实际的数据区域读取数据)
 ByteArrayInputStream
 FileInputStream
 PipedInputStream
 虚拟输入流 (不从实际的数据区域读取数据,依赖于一个或多个底层输入流作为数据源)
 SequenceInputStream
 ObjectInputStream
 FileterInputStream
尽管System.in声明为InputStream的实例,但在大多数系统中,标准输入流System.in还是用缓冲输入流的实例来实现的。
14.3 输出流
OutpStream抽象一次只输出一个字符。(效率低,其子类大都缓冲输出数据)
PrintStream输出结果用文本表示而不是二进制表示。System.out和System.err是其实例。
14.5 对象序列化
对象序列化:把对象转换成8位二进制数表示的过程(ObjectOutputStream类用来把对象值写入流,以便将来能方便地使用ObjectInputStream读回)
对象持久性:在不同程序调用中保持对象状态的能力。
对象序列化是对象持久性的关键(网络编程几乎都用到了对象序列化的概念,因为它允许通过网络把参数传递到其他计算机上运行的程序中)
Chapter 15 设计模式
15.1 适配器
问题:如果某个环境中需要某个对象,该对象提供了合适的行为,但是该对象所用的接口和环境不同,我们如何使用这个对象呢?
解决方案:定义一个适配器作为中介。适配器类本身的工作很少,只是把命令从一种形式转换成另一种形式。
在这里插入图片描述

15.2 组合
	问题:如何用简单的部件来构建复杂的对象呢?

解决方案:提供一组小的组件,允许这些组件任意嵌套。最终组合得对象允许统一地对待单个对象和对象组合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值