《Java设计模式及实践》—1.2.2 面向对象编程

举报
华章计算机 发表于 2019/07/22 10:34:54 2019/07/22
【摘要】 本节书摘来自华章计算机《Java设计模式及实践》一书中的第1章,第1.2.2节,[印度] 卡马尔米特·辛格(Kamalmeet Singh)[荷兰] 艾德里安·伊恩库列斯库(Adrian Ianculescu) 著[罗马尼亚] 路西安-保罗·托尔耶(Lucian-Paul Torje) 张小坤 黄 凯 贺 涛 译.

1.2.2 面向对象编程

面向对象编程经常与命令式编程联系在一起,在实践当中,两者是可以共存的。Java就是这种协作的生动证明。

接下来,我们将简要介绍面向对象的基本概念,代码都会以Java语言实现。

1.对象和类

对象是面向对象编程(OOP)语言的主要元素,它包括状态和行为。

如果我们将类视为模板,则对象是模板的实现。例如,如果“?人类?”是一个定义了人类所拥有的属性和行为的类,那么你我都是这个“?人类?”类的对象,因为我们已经满足了作为“?人类?”所有的要求。或者,我们把“?汽车?”视为一个类,那么一辆特定的本田思域汽车就是“?汽车?”类的一个对象。这辆本田思域汽车可以满足汽车类所具备的所有属性和行为,比如有引擎、方向盘、车灯等,还能前进、倒退等。我们可以看到面向对象范式如何与现实世界相关联。几乎现实世界中的所有东西都可以从类和对象的角度来考虑,因此OOP能够毫不费力地流行起来。

面向对象基于四个基本原则:

  • 封装

  • 抽象

  • 继承

  • 多态

2.封装

封装主要是指属性和行为的绑定。封装的思路是将对象的属性和行为保存在一个地方,以便于维护和扩展。封装还提供了一种隐藏用户所不需要的细节的机制。在Java当中,我们可以为方法和属性提供访问说明符来管理类使用者的可见内容以及隐藏内容。

封装是面向对象语言的基本原则之一。封装有助于不同模块的分离,使得开发人员可以或多或少地独立开发和维护解耦模块。在内部更改解耦模块/类/代码而不影响其外部暴露行为的技术称为代码重构。

3.抽象

抽象与封装密切相关,并且在某种程度上它与封装重叠。简而言之,抽象提供了一种机制,这种机制使得对象可以公开它所做的事,而隐藏它是如何做到这些事的。

我们拿现实世界中的“?汽车?”作为例子来说明抽象。为了驾驶一辆汽车,我们并不需要知道汽车引擎盖下是什么样的,我们只需要知道它给我们暴露的数据和行为。数据显示在汽车的仪表盘上,行为就是我们可以用控制设备来驾驶汽车。

4.继承

继承是指对象或类基于另一个对象或类的能力。有一个父类或者基类,它为实体提供顶级行为。每一个满足“?父类的属性和方法是子类的一部分?”条件的子类实体或者子类都可以从父类中继承,并根据需要添加其他行为。

让我们来看一个现实世界的例子。如果我们将Vehicle视为父类,我们知道Vehicle

类可以具有某些属性和行为。例如,Vehicle类有一个引擎、好几个门等等,并且它拥有移动这个行为。现在满足这些条件的所有实体(例如Car、Truck、Bike等),都可以从Vehicle类继承并添加给定的属性和行为。换句话说,我们可以说Car是一种Vehicle。

让我们来看代码如何实现。我们首先创建一个名为Vehicle的基类,此类拥有一个构造函数,这个函数能够接受一个String(字符串)类型的参数(车辆名称):

 image.png

现在我们创建一个拥有构造函数的Car类。Car类继承自Vehicle类,因此它继承并可以访问在基类中声明为protected(保护)或public(公共)的所有成员和方法:

 image.png

5.多态

从广义上讲,多态为我们提供了让不同类型的实体使用相同接口的选项。主要有两种类型的多态:编译时多态和运行时多态。有一个Shape类,拥有两个计算面积的方法。一个方法计算一个圆的面积,它接受一个整数,也就是说,输入半径并返回这个圆的面积。另一个方法计算矩形的面积,它需要两个输入—长度和宽度。编译器可以根据调用参数的数量来决定调用哪个面积方法。这是编译时多态。

有些技术人员认为,只有运行时多态才是真正的多态。运行时多态(有时也称为子类型多态)在子类继承父类并覆盖其方法时起作用。在这种情况下,编译器无法决定最终是执行子类的实现还是父类的实现,只能在运行时决定。

为了详细说明,我们采用前面的示例并向车辆类型添加新方法以打印对象的类型和名称:

 image.png

我们在派生的Car类中重写相同的方法:

 image.png

现在我们可以看到行为中的子类型多态。我们创建一个Vehicle对象和一个Car对象,将每个对象声明为Vehicle变量类型(因为Car也是Vehicle)。然后我们为每个对象调用toString方法。vehicle1是Vehicle类的一个实例,它将调用Vehicle.toString()方法。vehicle2是Car类的一个实例,它将调用Car类的toString方法:

image.png


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。