> For the complete documentation index, see [llms.txt](https://eric3wade.gitbook.io/java/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://eric3wade.gitbook.io/java/learning-the-java-language/oop-concepts/what-is-an-object.md).

# What Is an Object?

对象是相关状态和行为的软件捆绑。软件对象经常被用作现实世界你能找到的日常物品做建模。这里我们介绍如何用在对象表示中状态和行为，介绍数据封装的概念并解释这样设计软件的好处

## 什么是对象（Object）

对象是理解面向对象（`object-oriented`）技术的关键。环顾四周你就能在现实世界中找到很多对象：你的狗，桌子，电视机，自行车等。

现实世界的对象都有两个特征：状态（`state`）和行为（`behavior`）。狗的状态有：名字，颜色，品种，饥饿。狗的行为有：叫，取东西，摇尾巴。自行车的状态有：当前档位，当前脚踏节奏，当前速度，自行车的行为有：切换档位，改变脚踏节奏，刹车。分辨现实世界对象的状态和行为是思考面向对象编程的好办法。

现在花一点时间观察附近的现实世界的对象。每看到一个对象就问自己两个问题"这个对象有哪些状态"和"这个队形有哪些行为"，并记下你的观察。现在你会发现现实世界的对象是复杂的，你的台灯可能有两个状态（开和关）和两种行为（打开和关闭），但是你的收音机有额外的状态（开，关，音量，电台）和以下的行为（打开，关闭，增加音量，减少音量，寻找，扫描和切换电台）。你可能发现有些对象最终会包含其他对象。对现实世界的观察多会被转化为面向对象编程的世界。

![A software object.](https://docs.oracle.com/javase/tutorial/figures/java/concepts-object.gif)

软件对象在概念上和现实世界的对象很像：他们都包含状态和行为。对象中保存状态的被称为`fields`（有的编程语言称之为`variables`）并使用`methods`（有些编程语言称之为`functions`）来表示行为。使用函数操作对象中的状态是对象之间沟通的基本机制。隐藏内在状态而使用对象的函数进行交互的方式被称为`data encapsulation`（数据封装）——这是面向对象的基本原则。我们以自行车为例：

![A bicycle modeled as a software object.](https://docs.oracle.com/javase/tutorial/figures/java/concepts-bicycleObject.gif)

通过状态（当前速度，当前脚踏节奏，当前档位）并提供改变状态的函数，对象控制着外部世界如何使用它。比如，现在自行车一共6档，改变档位函数可以拒绝任何小于1或者大于6的数字。

将代码和单个软件对象进行捆绑会带来以下好处：

1. 模块化：一个对象源代码的编写与修改独立于其他对象的源代码。一旦被创建，对象可以在系统内部方便的传递
2. 信息隐藏：只通过对象的函数进行交互，外部世界并不了解内部的实现细节
3. 代码复用：如果对象已经存在（可能是其他开发者编写的），你可以可以在自己的程序中使用。这就允许专家实现/测试/调试复杂的，特定与任务的对象，你可以信任这些对象并在你的代码运行。
4. 可插拔性和调试简便性：如果某个对象运行出现问题，你可以简单的删除它人后引入另外的可以代替他的对象。这和现实世界中修复机械故障相类似。如果一个插销坏了，你可以替换台而不需要更换整台机器。
