# 什么是对象？

> 原文： [https://docs.oracle.com/javase/tutorial/java/concepts/object.html](https://docs.oracle.com/javase/tutorial/java/concepts/object.html)

对象是理解 _ 面向对象 _ 技术的关键。现在环顾四周，你会发现许多真实物体的例子：你的狗，你的桌子，你的电视机，你的自行车。

真实世界的物体共有两个特征：它们都具有 _ 状态 _ 和 _ 行为 _。狗有状态（名称，颜色，品种，饥饿）和行为（吠叫，取出，摇尾）。自行车还具有状态（当前档位，当前踏板节奏，当前速度）和行为（改变档位，改变踏板节奏，应用制动器）。识别真实世界对象的状态和行为是开始思考面向对象编程的好方法。

现在花点时间观察您附近区域的真实物体。对于您看到的每个对象，请问自己两个问题：“这个对象可能存在哪些状态？”和“这个对象可以执行什么样的行为？”。一定要记下你的观察结果。和你一样，你会发现现实世界的物体的复杂程度各不相同;您的桌面灯可能只有两种可能的状态（打开和关闭）和两种可能的行为（打开，关闭），但您的桌面电台可能有其他状态（开，关，当前音量，当前电台）和行为（打开） ，关闭，增加音量，减少音量，搜索，扫描和调整）。您可能还会注意到，某些对象反过来也会包含其他对象。这些现实世界的观察都转化为面向对象编程的世界。

<center>![A circle with an inner circle filled with items, surrounded by gray wedges representing methods that allow access to the inner circle.](img/75a7ec901c2832f3570a21c3be4c807b.jpg)

一个软件对象。

</center>

软件对象在概念上类似于现实世界的对象：它们也包括状态和相关行为。对象将其状态存储在 _ 字段 _（某些编程语言中的变量）中，并通过 _ 方法 _（某些编程语言中的函数）公开其行为。方法对对象的内部状态进行操作，并作为对象到对象通信的主要机制。隐藏内部状态并要求通过对象的方法执行所有交互被称为 _ 数据封装 _ - 面向对象编程的基本原则。

考虑一下自行车，例如：

<center>![A picture of an object, with bibycle methods and instance variables.](img/a64baab64d5ef7c3f903c317c0f20de8.jpg)

自行车被建模为软件对象。

</center>

通过归因于状态（当前速度，当前踏板节奏和当前档位）并提供改变该状态的方法，该对象仍然控制外部世界如何被允许使用它。例如，如果自行车仅具有 6 个档位，则换档的方法可以拒绝小于 1 或大于 6 的任何值。

将代码捆绑到单个软件对象中可带来许多好处，包括：

1.  模块化：可以独立于其他对象的源代码编写和维护对象的源代码。一旦创建，对象就可以轻松地在系统内部传递。
2.  信息隐藏：通过仅与对象的方法交互，其内部实现的细节仍然隐藏在外部世界之外。
3.  代码重用：如果对象已存在（可能由其他软件开发人员编写），则可以在程序中使用该对象。这允许专家实现/测试/调试复杂的，特定于任务的对象，然后您可以信任这些对象在您自己的代码中运行。
4.  可插拔性和调试简便性：如果某个特定对象有问题，您只需将其从应用程序中删除，然后插入另一个对象作为替代对象。这类似于解决现实世界中的机械问题。如果螺栓断裂，则将 _ 替换为 _，而不是整个机器。