Java 类(学习 Java 编程语言 023)

类(class)是构造对象的模板或蓝图(就是具有相同的属性和功能的对象的抽象的集合)。由类构造(construct)对象的过程称为创建类的实例(instance)。

类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型。

用 Java 编写的所有代码都位于某个类里面。标准 Java 库提供了几千个类,可用于各种目的,如用户界面设计、日期、日历和网络编程。尽管如此,在 Java 中还是需要创建一些自己的类,以便描述你的应用程序所对应的问题领域中的对象。

在 Java 中,没有类就不能做任何事情,然而,并不是所有的类都表现出面向对象的典型特征。例如 Math 类,Math 类只封装了功能,它不需要也不必隐藏数据。由于没有数据,因此也不必考虑创建对象的初始化它们的实例字段。

类名标准的命名规范: 类名是以大写字母开头的名词,如果类名由多个单词组成,每个单词的第一个字母都应该大写(这种在一个单词中间使用大写字母的方式称为骆驼命名法(camel case)。以其自身为例,应该写成 CamelCase)。

OPP 的原则:

  • 封装

    封装(encapsulation,有时称为数据隐藏)是处理对象的一个重要概念。从形式上看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。对象中的数据称为实例字段(instance field),操纵数据的过程称为方法(method)。作为一个类的实例,特定对象都有一组特定的实例字段值。这些值的集合就是这个对象的当前状态(state)。无论何时,只要在对象上调用一个方法,它的状态就有可能发生改变。

    实现封装的关键在于,绝对不能让类中的方法直接地访问其他类的实例字段。程序只能通过对象的方法与对象数据进行交互。封装给对象赋予了“黑盒”特征,这是提高重用性和可靠性的关键。这意味着一个类可以完全改变存储数据的方式,只要仍旧使用同样的方法操作数据,其他对象就不会知道也不用关心这个类发生的变化。

  • 继承

    通过扩展一个类来建立另外一个类的过程称为继承(inheritance)

    继承让用户自定义 Java 类变得轻而易举,这就是:可以通过扩展其他类来构建新类。事实上,在 Java 中,所有的类都源自于 Object 类。

    在扩展一个已有的类时,这个扩展后的新类具有所扩展的类的全部属性和方法。只需要在新类中提供适用于这个新类的新方法和数据字段就可以了。

1. 识别类

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

识别类的一个简单经验是在分析问题的过程中寻找名词,而方法对应着动词。

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

2. 类之间的关系

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

  • 依赖(dependence):即 “uses-a” 关系,是一种最明显的、最常见的关系。如果一个类的方法操作了另一个类的对象,我们就说一个类依赖于另个一个类。

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

  • 聚合(aggregation):即 “has-a” 关系,是一种具体且易于理解的关系。聚合关系意味着类 A 的对象包含了类 B 的对象。
  • 继承(inheritance):即 “is-a” 关系,表示一个更特殊的类与一个更一般的类之间的关系。一般而言,如果类 A 扩展类 B,类 A 不但包含从类 B 继承的方法,还会拥有一些额外的功能。

表达类关系的 UML 符号
Java 类(学习 Java 编程语言 023)

上一篇:L2-023 图着色问题 (25分)


下一篇:023 解释器模式