面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。在 OOP(Object Oriented Programming)中,不必关心对象的具体实现,只要能够满足用户的需求即可。

类(class)是构造对象的模板或蓝图。由类构造(construct)对象的过程称为创建类的实例(instance)。
封装(encapsulation,有时称为数据隐藏)是与对象有关的一个重要概念。从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域(instance field),操纵数据的过程称为方法(method)。对于每个特定的类实例(对象)都有一组特定的实例域值。这些值的集合就是这个对象的当前状态(state)。实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域。程序仅通过对象的方法与对象数据进行交互。
在 Java 中,所有的类都源于 Object,超类。
通过扩展一个类来建立另外一个新类的过程称为继承(inheritance),这个扩展后的新类具有所扩展的类的全部属性和方法。

对象

OOP 中对象的三个主要特征

  • 对象的行为(behavior),可以看成是可调用的方法。
  • 对象的状态(state),当前对象的特征信息。
  • 对象标识(identity),每个对象都有一个唯一的表示。

    设计类

    根据以往的经验,一般类的命名为名词,而类中的方法一般为动词
    如,有商品(Item)和订单(Order)类,其中商品被添加(add)到订单中,订单被发送(send)或取消(cancel),订单付款(pay)被支付。

    类之间的关系

    最常见的关系为

  • 依赖,uses-a
    依赖(dependence),即“uses-a”关系,是一种最明显的、最常见的关系。
    例如,订单类使用账户类是因为订单对象需要访问账户对象查看信用状态。但是商品类不依赖于账户类,这是因为商品对象与客户账户无关。
    因此,如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。应该尽可能地将相互依赖的类减至最少。如果类 A 不知道 B 的存在,它就不会关心 B 的任何改变(这意味着 B 的改变不会导致 A 产生任何 bug)。用软件工程的术语来说,就是让类之间的耦合度最小

  • 聚合,has-a
    聚合(aggregation),即“has-a”关系,是一种具体且易于理解的关系。
    例如,一个订单对象包含一些商品对象。聚合关系意味着类 A 的对象包含类 B 的对象。
    有些人也使用 关联 来表达聚合的意思。
  • 继承,is-a
    继承(inheritance),即“is-a”关系,是一种用于表示特殊与一般关系的。
    例如,优先处理订单类由订单类继承而来。在具有特殊性的优先处理订单类中包含了一些用于优先处理的特殊方法,以及一个计算运费的不同方法;而其他的方法,如添加商品、生成账单等都是从订单类继承来的。
    一般而言,如果类 A 扩展类 B ,类 A 不但包含从类 B 继承的方法,还会拥有一些额外的功能。