Java 语言(基本上)是面向对象的。本节将介绍 OOP 语言概念,并使用结构化编程作为一个对比。
什么是对象?
面向对象的语言遵循的编程模式不同于结构化编程语言,比如 C 和 COBOL。结构化编程范例是高度面向数据的:您拥有数据结构,然后程序指令会处理该数据。面向对象的语言(比如 Java 语言)将数据和程序指令组合到 对象 中。
对象是一个独立的实体,它仅包含属性和行为,不含其他任何东西。在面向对象的语言中,数据和程序逻辑被组合在一起,而不是通过字段(属性)提供一个数据结构,并将该结构传递给处理它的所有程序逻辑(行为)。这种组合可能出现在完全不同的粒度级别上,从细粒度的对象(比如 Number
)到粗粒度的对象(比如一个大型银行应用程序中的 FundsTransfer
服务)。
父对象和子对象
父对象 用作派生更复杂的 子对象 的结构基础。子对象看起来类似于父对象,但更加特殊化。在面向对象的范例中,可以重用父对象的通用属性和行为,也可以向子对象添加不同的属性和行为。
对象通信和协调
对象通过发送消息(在 Java 用语中称为 方法调用 )与其他对象进行通信。此外,在面向对象的应用程序中,程序代码会协调对象之间的活动,以便在特定应用程序域的上下文内执行任务。
对象总结
一个精心编写的对象:
- 有明确定义的边界
- 执行一组有限的活动
- 只知道它的数据和它完成活动所需的其他所有对象
实质上,对象是一个离散的实体,它仅在其他对象上拥有必要的依赖关系来执行其任务。
是时候看看 Java 对象看起来像什么了。
示例:person 对象
第一个示例基于一种常见的应用程序开发场景:一个通过 Person
对象表示的人。
从对象的定义可以知道,一个对象有两个主要元素:属性和行为。下面将介绍这些元素如何应用到 Person
对象。
根据经验,可将对象的属性视为 名词 ,将行为视为 动词 。
属性(名词)
一个人可能有哪些属性?一些常见属性包括:
- 名称
- 年龄
- 身高
- 体重
- 眼睛颜色
- 性别
您可能会想到更多属性(而且始终可以在以后添加更多属性),但此列表是一个不错的开端。
行为(动词)
一个真正的人可以做各种各样的事,但对象行为通常与某种应用程序上下文相关。例如,在业务应用程序上下文中,您可能想询问您的 Person
对象,”您的体重指数 (BMI) 是多少?”作为响应,Person
将使用它的身高和体重属性的值来计算 BMI。
Person
对象内部可能隐藏着更复杂的逻辑,不过现在,我们假设 Person
具有以下行为:
- 计算 BMI
- 输出所有属性
状态和字符串
状态 是 OOP 中的一个重要概念。对象的状态在任何时刻都由它的属性的值来表示。
对于 Person
,它的状态由姓名、年龄、身高和体重等属性来定义。如果想提供多个属性的列表,可以使用 String
类来完成此任务,稍后我们会更详细地介绍该类。
结合使用状态和字符串的概念,您可以对 Person
说:“向我提供你的属性列表(或 String
)来告诉我你是谁”。
OOP 的原则
如果您拥有结构化编程背景,您可能还不清楚 OOP 的价值主张。毕竟,一个人的属性和检索(并转换)这些值的任何逻辑都可使用 C 或 COBOL 编写。如果理解了 OOP 的定义原则,OOP 范例的优势就会更加明显: 封装、 继承 和 多态性。
封装
回想一下,对象是离散的(或独立的)。此特征就是 封装 的工作原理。 隐藏 是另一个有时用于表达对象的独立、受保护性质的术语。
无论使用哪个术语,重要的是对象在它的状态和行为与外部世界之间保持一个界线。像真实世界中的物体一样,计算机编程中使用的对象与使用它们的应用程序中的不同类别的对象之间有着各种各样的关系。
在 Java 平台上,可以使用 访问修饰符 (将在后面介绍)将对象关系从 公共 改为 私有。公共访问是完全开放的,而私有访问意味着对象的属性只能在对象自身内访问。
公共/私有边界实施了面向对象的封装原则。在 Java 平台上,可以逐个对象地改变该边界的强度。封装是 Java 语言的一个强大特性。
继承
在结构化编程中,常常会复制一个结构,为它提供一个新名称,然后添加或修改属性,使新实体(比如一个 Account
记录)不同于它的原始来源。随着时间的推移,此方法会生成大量重复代码,这可能带来维护问题。
OOP 引入了 继承 的概念,特殊化的类(无需额外的代码)可”复制”它们要特殊化的来源类的属性和行为。如果需要更改其中一些属性或行为,可以重写它们。您更改的唯一的源代码是创建特殊化的类所需的代码。源对象称为 父对象 ,新的特殊化对象称为 子对象 — 我们已介绍过这两个术语。
假设您正在编写一个人力资源应用程序,并想要使用 Person
类作为一个名为 Employee
的新类的基类(也称为 超类)。作为 Person
的子类, Employee
将拥有 Person
类的所有属性,以及更多属性,比如:
- 纳税人识别编号
- 员工编号
- 工资
继承使创建新的 Employee
类变得很容易,不需要手动复制所有 Person
代码。