简述Java中的OOPs(面向对象编程系统)基本概念

面向对象编程是一种编程概念,其核心思想是允许用户创建所需要的对象,然后提供处理这些对象的方法,使用者通过操作对象而获得运算数据。

本文将以简洁的方式对面向对象编程中的概念进行梳理。

1. Class(类)

​ 你可以将类理解为对一组相似实体的统称。类只是一个逻辑组件,并不是具体的物理实体。例如,你可以创建一个名为“Bird”的鸟类,则它可能包含乌鸦,喜鹊,麻雀,鹦鹉等对象。其属性(数据)可以是这些鸟的颜色,体重或者身高。除此之外,你还可以为鸟类提供飞行,捕食,鸣叫等方法。

2. Object(对象)

​ 你可以将对象理解为类的一个实例或者具体的一个个体。在Java中一个类可以有多个对象实例,但一个对象实例只能对应一个类。对象既包含数据又包含对数据进行操作的方法。例如,我们日常生活中能够体现具体物理事物的钢笔,电脑桌,显示器,自行车,玻璃杯等等。

3. Inheritance(继承)

​ 继承是Java中的一种机制,它允许其中一个对象获取父对象的所有属性和行为(方法)。他是面向对象编程系统(OOPS)的重要组成部分。Java继承的思想是可以创建基于现有类的新类。从现有类继承时,可以重用父类的字段和方法。除此之外,你还可以在当前类中添加新的字段和方法。

​ 在Java中,类的继承可以分为三种:单继承,多继承和分层继承。但需要注意的是,这里提到的多继承是相对于被继承类而言的,Java中不允许一个类继承多个类。Java中的多重继承可以通过接口来实现。

4. Polymorphism(多态)

​ 简单来说,多态是指类的属性和方法在不同的对象实例中具有不同的表现形式。例如,在Animal(动物)类中有一个speak()方法,在不同的对象实例中,如狗的speak()是“汪汪~”,猫的speak()是“喵喵~”,牛的speak()是“哞哞~”,羊的speak()是“咩咩~”等等。

5. Abstraction(抽象)

​ 抽象是指只表示一个类的基本特征而隐藏其内部细节的行为。例如,我们可以把汽车抽象为一个具备发动机,轮子,方向盘,刹车,变速箱,座椅等部件的物体,但发动机是几缸的,加汽油还是柴油,变速箱是手动还是自动,座椅是带加热还是不带加热的等细节我们不去关心,仅仅描述一台汽车的基本特征即可。

6. Encapsulation(封装)

​ 简单来说,封装是一种将代码和数据包装到一个单元中的OOP技术。在OOPs概念中,一个类的变量始终对其他类隐藏,想要获取类中的变量,只能使用当前类提供的方法对其进行访问。我们以胶囊药物为例,基本上,胶囊封装了药物的几种组合,如果药物的组合看成是变量和方法的,则胶囊将充当一个类,使用胶囊包裹药物的过程则称为封装。

7. Association(关联)

​ 关联是指两个对象之间存在某种联系,它定义了对象之间的多样性。例如,学生与老师之间存在着关联,学生上老师的课,老师教学生知识。在Java中,关联关系可以有一对一关联,一对多关联,多对多关联和多对一关联。

8. Aggregation(聚合)

​ 聚合是关联的一种特定情况,属于关联的子集。与继承不同的是聚合表示一种“has-a”的关系,而继承表示一种“is-a”的关系。以汽车为例子,一台车子由发动机,变速箱,外壳,轮子,刹车系统等组成。在这种模式中,父类的生命周期结束,不会影响到子类的生命周期,换而言之,在聚合中,每个对象都有自己的生命周期,例如,一辆汽车被拆卸开后,器发动机,大灯,方向盘,轮子,座椅等子部件仍然还能正常工作。

9. Composition(组合)

​ 组合是聚合的一种特殊关系,它表现为整体与局部具有某种“死亡契约”。当整体的生命周期结束时,局部的生命周期也随之结束。例如,我们以人为例,人简单的可概括为由头,手,脚和躯干四个部分组成,当人死亡时,组成人的这四个部分也随之死亡。也就是说,局部不能离开整体而单独工作。

​ 大部分刚刚接触面向对象编程的同学都会被关联,聚合和组合这三种关系搞晕,这里简单的总结一下这三者之间的关系。

10. 关联,聚合和组合之间的异同

​ 一般地,关联是一种非常通用的术语,用于表示一个类何时使用另一个类提供的功能。如果一个父类对象拥有另一个子类对象并且如果父类对象生命周期结束子类对象也无法正常工作时,则称为组合,反之则称为聚合。