为什么 Java 是面向对象编程?

2025年9月4日 | 阅读 9 分钟

对象展示了现实世界中的事物,包含数据(如变量)和行为(如方法)。对象使代码更加组织化、易于重用,并且有利于管理大型项目。Java 还使用了继承(共享其特性)、封装(隐藏细节)、多态(以不同方式执行相同操作)等重要特性。这有助于使程序更加灵活和高效。

面向对象编程的特性

Why Java is Object-Oriented Programming

1. 类 (Class)

在面向对象编程中,是基本的构建块。它可以被定义为一个模板,描述与类实例化相关的数据和行为。实例化一个类就是创建该类的一个对象(变量),可以使用该对象来访问类的成员变量和方法。

类也可以被称作是创建具有共同属性和方法的对象的逻辑模板。

例如,一个 Employee 类可能包含所有员工的详细信息,形式为变量和方法。如果该类被实例化(即创建了该类的对象,比如 e1),我们就可以访问该类的所有方法或属性。

要阅读更多 Java 类

类的示例

2. 对象 (Object)

Java 中的对象是类的实例。类是指定对象构成和操作的模型或模板。它描述了该类的一个对象可能拥有的数据和行为,以属性和方法的形式。将类比作房子的设计图,将对象比作根据该设计图建造的实际房子。

要阅读更多 Java 对象

每个对象都具有以下特征:

  • 状态(State):这展示了对象包含的数据或信息。例如,“汽车”对象有颜色、速度和品牌。这些是它的属性
  • 行为(Behavior):这表示对象可以做什么以及执行哪些操作。对于同一个“汽车”对象,其行为可以是驾驶、停止或转弯。这些被写成方法
  • 标识(Identity):每个对象都有一个唯一的名称或标识。

抽象的示例

下面是用“Person”类创建对象的示例说明:

在这个例子中,我们创建了一个 Person 类的对象,并将其赋值给变量 person。

3. 抽象 (Abstraction)

在 Java 中,抽象是隐藏实现细节,只暴露对用户必要的特性或功能的过程。它强调对象做什么,而不是它怎么做。

要阅读更多 Java 抽象

抽象的示例

示例

编译并运行

输出

Playing guitar strings.
Blowing into the flute.

解释

上面的 Java 程序通过使用一个乐器示例来展示抽象。我们创建了一个名为 Instrument 的抽象类,其中有一个 playSound() 方法,在抽象类中我们没有创建它的方法体。然后 Guitar 和 Flute 两个类扩展了 Instrument 类,并提供了它们各自版本的 playSound() 方法。

在 Main 类中,我们使用抽象类来创建 Guitar 和 Flute 的对象。当调用 playSound() 方法时,每个对象都会产生不同的输出。这展示了抽象如何通过允许我们定义通用的方法名,同时让每个类拥有自己的行为来工作。

4. 继承 (Inheritance)

继承允许一个类继承另一个类(称为超类或父类)的属性和行为。从超类派生的类称为子类或子组。通过继承,子类可以访问其超类的成员(字段和方法),强制执行重用规则,并鼓励层次结构。

继承代表 IS-A 关系,也称为父子关系。

要阅读更多内容,请访问 Java 继承

继承的示例

示例

编译并运行

输出

Applying for Loan.
Checking Eligibility for loan
Education loan: For students, flexible repayment after graduation.

解释

上面的 Java 程序通过不同类型的贷款展示了继承。Loan 类被称为父类,具有 applyLoan() 和 checkEligibility() 等通用方法。EducationLoan 类是子类,它继承了 Loan 类的属性和功能,并添加了自己特有的方法。

EducationLoan 类有 educationLoanDetails() 方法用于教育贷款详情。在 Main 类中创建了 EducationLoan 的对象,这些对象调用了继承的方法。这个例子展示了继承如何实现代码重用并在子类中扩展功能。

5. 多态 (Polymorphism)

Java 中的多态是指我们可以以不同方式执行单个操作的概念。多态源自两个希腊词:poly 和 morphs。 “poly” 的意思是“多”,“morphs” 的意思是“形式”。因此,多态意味着多种形式。

要阅读更多 Java 多态

多态有两种类型:

  1. 编译时多态
  2. 运行时多态

多态的示例

示例

编译并运行

输出

Animal makes a sound
Dog barks
Cat meows

解释

上面的 Java 程序使用一个简单的动物示例展示了多态。父类名为 Animal,它有一个名为 sound() 的方法。Animal 类有两个子类 Dog 和 Cat,它们使用 extends 关键字继承 Animal 类,并重写了 sound() 方法以提供它们各自特定的行为。

当调用 sound() 方法时,Dog 类打印“Dog barks”,Cat 类打印“Cat meows”。在 main 方法中,创建了三个对象:一个 Animal 类型的,另外两个也是 Animal 类型,但分别持有 Dog 和 Cat 的对象。根据实际的对象类型,调用 sound() 方法时,每个对象都会有不同的响应。

这展示了运行时多态,其中相同的方法名(sound())根据调用它的对象执行不同的操作。这有助于使代码更加灵活和易于管理。

6. 封装 (Encapsulation)

封装是将代码和数据包装到一个单元中的过程。胶囊是封装的完美例子,因为胶囊是多种药物的混合物。

要阅读更多 Java 封装

封装的示例

示例

编译并运行

输出

Name of student: John
Roll Number of student: 101

解释

Student 类和 Main 类是上面 Java 程序中的两个类。Student 类存储姓名和学号,这些被设为私有,因此不能直接访问。所以,我们使用方法来设置和获取值。在 Main 类中,我们创建了一个 student 对象,设置了姓名和学号,然后打印它们。这就是所谓的封装,意味着保护数据安全,只允许通过受控访问。

面向对象编程的优点

更好的代码组织:为了更好地组织代码,OOP 有助于将程序分解成称为类和对象的更小的部分,使代码干净且易于管理。

可重用性:一旦创建了类,它就是可重用的,可以在其他程序中重复使用,这节省了时间。

易于维护:由于代码得到了组织,因此易于维护,并且在不影响整个程序的情况下,也易于查找和修复错误或进行更改。

数据安全性:它通过将数据隐藏在类中来保护数据的安全,因此我们只能通过选定的方法来访问或更改数据。这称为封装。

面向对象编程的缺点

更复杂:对于初学者来说,它可能更复杂且更难学习,因为它涉及对象、类、继承和多态等概念。

耗时更多:与简单的、直接的编码相比,使用 OOP 设计程序需要更多的计划和时间。

更大的代码量:OOP 程序通常由于类结构和额外的函数而具有更多的代码行,这可能会使程序变大。

执行速度较慢:OOP 程序由于对象和方法调用等额外的层而比简单程序运行得慢一些。

结论

在 Java 中,面向对象编程 (OOP) 是一种流行的编程方法,它使得设计、组织和维护复杂软件系统变得容易。OOP 主要关注创建展示现实世界实体,并具有属性(数据)和方法(行为)的对象。

OOP 的重要特性,如对象和类、继承、多态、封装和抽象,有助于将问题分解为可管理的块,促进代码重用,并增强数据安全性。具有这些特性的程序更容易维护、更具可扩展性和更灵活。

对于小型项目,简单的编程方法可能更合适。总而言之,OOP 是一个强大的工具,用于构建组织良好、易于维护且高效的软件系统。

面向对象编程选择题

1. 使用面向对象编程 (OOP) 的优点是什么?

  1. 它加快了程序的运行速度。
  2. 它以结构化和可重用的方式组织代码。
  3. 它占用的内存更少。
  4. 它能自动查找和纠正错误。
 

答案: B

解释:面向对象编程 (OOP) 有助于将代码组织到类和对象中,从而便于在项目之间进行管理、维护和重用。


2. 以下哪一项不是面向对象编程的必备组件?

  1. 继承
  2. 封装
  3. 编译
  4. 多态
 

答案:C

解释:编译不是 OOP 特有的功能,而是通用的编程过程。OOP 侧重于继承、封装和多态。


3. Java 中的封装是什么意思?

  1. 重用不同类的中的方法
  2. 在子类中更改方法的签名
  3. 隐藏对象的内部细节
  4. 从现有对象创建新对象
 

答案:C

解释:封装将类的内部数据设为私有,并仅提供公共方法(getter 和 setter 方法)来以受控方式访问或修改数据。


4. 以下哪一项是面向对象编程的一个缺点?

  1. 易于维护代码
  2. 设计和规划更复杂
  3. 代码可重用性
  4. 数据安全性得到提高
 

答案: B

解释:在面向对象编程中,需要非常仔细地进行设计和规划,因为它比简单的过程式编程方法对初学者来说更复杂。


5. 当父类引用用于保存子类对象的数据时会发生什么?

  1. 我们只能调用父类中的方法。
  2. 父类和子类的方法都可以调用
  3. 无法创建子类对象
  4. 程序会抛出错误
 

答案: A

解释:当父类引用持有子类对象时,我们只能访问父类的方法,而不能访问指定的子类方法。