ad

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.1.2 对象

admin 60 2023-10-25

【摘要】 本书摘自《Java核心技术》一书中第4章,第1节,作者是来自美国的凯·S.霍斯特曼(Cay S.Horstmann),由林琪、苏钰涵等译。

4.1.2 对象

要想使用OOP, 一定要清楚对象的三个主要特性:

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.1.2 对象

● 对象的行为(behavior)—— 可以对对象完成哪些操作,或者可以对对象应用哪些 方法?

● 对象的状态 (state)—— 当调用那些方法时,对象会如何响应?

● 对象的标识 (identity)—— 如何区分具有相同行为与状态的不同对象?

同一个类的所有对象实例,由于支持相同的行为而具有家族式的相似性。对象的行为是 用可调用的方法来定义的。

此外,每个对象都保存着描述当前状况的信息。这就是对象的状态。对象的状态可能会 随着时间而发生改变,但这种改变不会是自发的。对象状态的改变必须通过调用方法实现 (如果不经过方法调用就可以改变对象状态,只能说明破坏了封装性)。

但是,对象的状态并不能完全描述一个对象。每个对象都有一个唯一的标识 (identity, 或称身份)。例如,在一个订单处理系统中,任何两个订单都存在着不同之处,即使所订购 的货物完全相同,它们也是不同的订单。需要注意,作为同一个类的实例,每个对象的标识 总是不同的,状态也往往存在着差异。

对象的这些关键特性会彼此相互影响。例如,对象的状态影响它的行为(如果一个订单 “已送货”或“已付款”,就应该拒绝调用要求增删订单中商品的方法。反过来,如果订单是 “空的”,即还没有预订任何商品,这个订单就不应该“送货”)。

4.1.3 识别类

传统的过程式程序中,必须从顶部的main 函数开始编写程序。在面向对象程序设计时没 有所谓的“顶部”。学习OOP 的初学者因而常常会感觉无从下手。答案是:首先从识别类开 始,然后再为各个类添加方法。

识别类的一个简单经验是在分析问题的过程中寻找名词,而方法对应着动词。 例如,在订单处理系统中,有这样一些名词:

● 商品 (Item);

● 订单 (Order);

● 送货地址 (Shipping address);

● 付款 (Payment);

● 账 户 (Account)。

从这些名词就可以得到类 Item、Order等。

接下来查看动词。商品被添加到订单中,订单会发货或取消,另外可以对订单完成付 款。对于每一个动词,如“添加”“发货”“取消”以及“完成付款”,都要识别出负责完成相 应动作的对象。例如,当一个新的商品添加到订单中时,那个订单对象就是负责的对象,因 为它知道如何存储商品以及如何对商品进行排序。也就是说, add应该是Order类的一个方法,它要取一个Item对象作为参数。

当然,这种“名词与动词”原则只是一种经验,在创建类的时候,只有经验才能帮助你 确定哪些名词和动词重要。

4.1.4 类之间的关系

在类之间,最常见的关系有

● 依 赖 ( "uses-a");

● 聚合(“has-a”);

● 继 承 ( "is-a")。

依赖 (dependence), 即 “uses-a”关系,是一种最明显的、最常见的关系。例如, Order 类使用Account类是因为Order对象需要访问Account 对象查看信用状态。但是Item类不依赖于 Account类,因为Item对象不需要考虑客户账户。因此,如果一个类的方法使用或操纵另一个 类的对象,我们就说一个类依赖于另一个类。

应该尽可能地将相互依赖的类减至最少。这里的关键是,如果类A不知道B的存在,它 就不会关心B 的任何改变(这意味着B 的改变不会导致A 产生任何 bug)。 用软件工程的术语 来说,就是尽可能减少类之间的耦合。

聚合 (aggregation), 即 “has-a”关系,很容易理解,因为这种关系很具体。例如, 一个 Order对象包含一些Item对象。包容关系意味着类A 的对象包含类B 的对象。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 [email protected] 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.5.7 关系和 boolean 运算符
下一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.3.1 整型
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×