Thinking in Java - - 对象导论(一)

1.1抽象过程
抽象:从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。例如苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。
建模:为了理解事物而对事物做出的一种抽象,是对事物的一种无歧义的书面描述。这里的建模含义偏向于计算机方面,是高于语言局限的抽象问题、解决方案,是更高一级的抽象。
面向对象语言的五个基本特性:①万物皆为对象。②程序是对象的集合,它们通过发送消息来告知彼此所要做的。③每个对象都有自己的有其他对象所构成的存储(可以通过创建包含现有对象的包的方式来创建新类型的对象)。④每个对象都拥有其类型(每个对象都是某个类‘class’的一个实例‘instance’)。⑤某一特定类型的所有对象都可以接受同样的消息。

1.2每个对象都有接口
class:由银行出纳员问题–在程序执行期间具有不同的状态而其他方面都相似的对象会被分组到对象的类中,这就是关键字class的由来。

因为类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型,例如所有浮点型数字具有相同的特性和行为集合,二者的差异在于,程序员通过定义类来适应问题,而不再被迫只能使用现有的用来表示机器中的存储党员的数据类型。

每个对象都只能满足某些请求,这些请求由对象的接口(interface)所定义,决定接口的便是类型。如下图的灯泡
这里写图片描述
上例中,类型/类的名称为Light,特定的Light的对象名称是lt,可以向Light对象发出的请求是:打开(on)、关闭(of)、调亮(brighten)、调暗(dim)。定义一个对象的“引用”(lt),然后调用new方法来创建该类型的新对象。为了向对象发送消息,需要声明对象的名称,并以圆点符号连接一个消息请求。

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

将对象看作服务提供者还有另外一个好处就是:它有助于提高对象的内聚性。高内聚是软件设计的基本素质要求之一:这意味着一个软件构件的各个方面“组合”得很好。

1.4被隐藏的具体实现
将程序开发人员按照角色分为类的创建者和客户端程序员(类的消费者,使用者)。创建者目标是创建类,消费者目标是收集各种用来实现快速应用开发的类。这种类只向客户端程序员暴露必需的部分,而隐藏其他部分。这样,类的创建者可以任意修改被隐藏的部分,不会影响其他人。被隐藏的部分通常是对象内部脆弱的部分,容易毁坏,因此将实现隐藏起来可以减少bug。

访问控制有两个原因:一是不让客户端程序员触及他们不应该触及的部分。第二允许设计者改变类内部的工作方式而不用担心影响到客户端程序员。

Java三个关键字在类的内部设定边界:public、private、protected。public表示紧随后面的元素对任何人都是可用的,private后的元素表示除了类型创建者和类型内部方法之外的任何人都无法访问的元素。protected和private相当,差别在于继承的类可以访问protected成员,但是不能访问private。

Java还有一种默认的访问权限,类可以访问同一个包中的其他类的成员,但是在包外则和private一样。

1.5复用具体实现
代码复用是面向对象程序设计语言所提供的最了不起的优点之一。

最简单的复用某个类的方式就是直接使用该类的一个对象,此外也可以将那个类的一个对象置于某个新的类中。

新的类可以由任意数量、任意类型的其他对象以任意可以实现新的类中想要的功能方式所组成。因为实在使用现有的类合成新的类,所以这种概念也被称为组合,如果组合是动态发生的,那么它通常被称为聚合

1.6继承
对象这种观念,让我们可以将数据和功能封装到一起,不再受制于必须使用底层机器语言。但是在创建一个类以后,即使另一个新类与其具有相似的功能,你还是得重新创建一个新类。如果我们能够以现有的类作为基础,复制它,然后通过添加和修改这个副本来创建新类那就好多了。继承(extends)就是用来达到这个效果的。不过也有例外,当源类(也被称为基类、超类、父类)发生变动,被修改的“副本”(也叫导出类、继承类、子类)也会反映出这些变动。
继承关系
当继承现有类型时,也就创建了新的类型。这个新的类型不仅包括现有类型的所有成员(尽管private成员被隐藏,并且不可访问),而且更重要的是它复制了基类的接口。也就是说,所有可以发送给基类对象的消息同时也可以发送给导出类对象。由于通过发送给类的消息的类型可知类的类型,所以这也就意味着导出类与基类具有相同的类型

有两种方法可以使基类与导出类产生差异:①直接在导出类中添加新方法。这些新方法不是基类接口的一部分。②改变现有基类的方法的行为,这被称之为覆盖(overriding);即‘此时,我正在使用相同的接口方法,但是我想在新类型中做些不同的事’。方法同名,内在实现不同。

替代原则:继承只覆盖基类的方法。基类与导出类之间的关系称为is-a(是一个)关系。
导出类中添加新的接口元素,基类与导出类之间的关系称为is-like-a(像是一个)关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值