简述“面向对象”

先简单的说一下什么是“程序”:

  • 面向过程时:程序 = 算法 + 数据结构;
  • 面向对象时:程序 = 基于对象操作的算法 + 以对象为最小单位的数据结构。

一、什么是对象?

对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞船等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划、概念或事件。

可以说“一切皆对象”。 

人们还发现,一切对象都可以用「数据」和「能力」来描述。比如:

  • 描述一个人「数据」就是年龄、身高体重,「能力」就是他能做什么工作,承担什么样的责任。
  • 描述一台电视,「数据」就是它的屏幕尺寸、亮度,「能力」就是播放电影电视剧等。

二、什么是面向过程?

面向过程很好理解,可以简单理解成软件开发工程师接到需求后,会把它拆成一个一个的命令,然后串起来交给计算机去执行。

举个例子,产品经理说要把大象装进冰箱里。程序员列了几个步骤:

  • 把冰箱门儿打开。
  • 把大象装进去。
  • 把冰箱门儿关上。

上面每一个步骤,程序员都会用一个「函数」来实现。所有函数定义好了之后,依次调用就可以了:

  • openTheDoor();
  • pushElephant();
  • closeTheDoor();

需求完成,顺利交工,但产品经理说才刚刚开始 XD。

  • 「我要把大象装微波炉里」
  • 「我要把狮子也装冰箱里」
  • 「我要把大象装冰箱,但是门别关,敞着就行」......

如果还是用面向过程的方法来应付,每次需求的变更,程序员就要把整个系统通读一遍,找出可用的函数(如果没有就再定义一个),最后依次调用它们。

虽然功能都能实现,对于计算机无论程序多么的复杂,计算机总是能轻松应付,但是对于越来越杂乱无章难以阅读 难以维护管理的系统,软件开发工程师会不堪重负,纷纷操起刀走上了犯罪的道路。

三、什么是面向对象?

于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路、习惯、步骤来设计相应的应用程序?

这样的程序,人们在读它的时候,会更容易理解,也不需要再把现实世界和程序世界之间来回做转换。

首先看一下面向对象的三大特性:

  • 封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。 
  • 继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用。 
  • 多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。 

面向对象是为了解决系统的可维护性,可扩展性,可重用性而应运而生的。

四、怎样实现面向对象?

前面说过 对象可以用「数据」和「行为」来描述,相当于对象成了一个黑匣子,那我们怎么知道对象具有什么样的能力呢? 

这个问题的关键就是接口。

对象把它的能力通过接口的方式公布出来,自己则成为接口的实现者。

这样调用者就不用关心接口背后的对象是什么东西,如何实现的了。

我们还以上面“大象”的需求为例,产品经理现在说要把大象放洗衣机里,通过我们的分析,洗衣机也需要有「开门」、「关门」的能力。

那么我们就可以抽象出一个接口来,它就是「开门」和「关门」的能力集合,假设我们称之为「大象の家」接口。

我们的对象冰箱、微波炉、洗衣机都实现「大象の家」的接口,尽管实现方式不一样,但是在外界看来,它们都是一样的,都是可以盛放大象的容器。

这样我们编程的时候就可以这样写:

  • 向大象の家下达「开门」的命令。
  • 向大象下达「进冰箱」的命令。
  • 向大象の家下达「关门」的命令。

至于 大象の家 到底是个什么东西,我们可以不关心。

即使哪天变成了马桶,「开门」和「关门」的具体实现交给负责马桶对象的同事,我们只管调用就可以了。

专业点讲,面向对象是一种思想:

  • 他让我们在分析和解决问题时,把思维和重点转向现实中的 客体 中来;
  • 然后通过UML工具理清这些客体之间的联系;
  • 最后用面向对象的语言实现这种 客体 以及 客体之间 的联系。

五、面向对象的三大步骤

1、面向对象的 分析(OOA)

    首先是分析需求,先不要思考怎么用程序实现它,先分析需求中稳定不变的客体都是些什么,这些客体之间的关系是什么。

2、面向对象的 设计(OOD)

    把第一步分析出来的需求,通过进一步扩充模型,变成可实现的、符合成本的、模块化的、低耦合高内聚的模型。

3、面向对象的 编程实现(OOP)

    使用面向对象的思想来实现模型 。

六、面向过程到面向对象思维如何转变? 

通常情况下软件开发工程师在拿到一个需求的时候,第一个反应就是如何实现这个需求,这是典型的面向过程的思维过程,而且很快就可能实现了它。

而面向对象,面对的却是客体,第一步不是考虑如何实现需求,而是进行需求分析,就是根据需求找到其中的客体,再找到这些客体之间的联系。

因此面向过程和面向对象的思维转变的关键点,就是在第一步设计,拿到需求后,一定先不要考虑如何实现它,而是通过UML建模,然后按照UML模型去实现它。

七、感谢

多谢以下两位博主的资料:

什么是对象,为什么要面向对象,怎么才能面向对象?

五分钟理解什么是面向对象

小结:

从面向过程 到 面向对象 是一个日积月累过程。

这就印证了当初入Java坑,讲师在讲解“面向对象”时说【初学者可以先不要深层次的理解什么是”面向对象”,一两年后自己就会悟出来并且用的得心应手】。

共勉!

转载于:https://my.oschina.net/niepanLs/blog/875384

面向对象编程(OOP)是一种以对象为基础的程序设计方法,其核心在于将数据和操作数据的方法封装在一起,从而模拟现实世界中的实体[^2]。在面向对象编程中,基本概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)、多态(Polymorphism)等。 ### 类对象 - **类**是具有相同属性和行为的对象的模板或蓝图。它定义了这些对象的共同特征,包括数据成员(属性)和成员函数(方法)。 - **对象**是类的具体实例,每个对象都有自己的状态和行为。例如,一个`Car`类可以有多个对象,如`car1`、`car2`等,它们各自拥有不同的颜色、品牌等属性值。 ### 继承 - **继承**允许创建一个新类(子类),从已有的类(父类)那里继承属性和方法。这种机制促进了代码重用,并且可以建立类之间的层次关系。例如,`ElectricCar`类可以从`Car`类继承所有特性,并添加自己特有的属性如电池容量。 ### 封装 - **封装**是指隐藏对象内部实现细节的能力,只对外暴露必要的接口。这样做的好处是可以保护对象的状态不被外部直接修改,同时简化了用户的使用过程。访问控制修饰符如`public`、`private`和`protected`用于指定成员的可访问性[^3]。 ### 多态 - **多态**意味着同一个接口可以在不同类型的对象上执行不同的操作。这通常通过方法重载(Overloading)和覆盖(Overriding)来实现。比如,一个名为`draw()`的方法可以在`Circle`、`Square`等多个图形类中存在,但具体实现会根据对象类型而有所不同。 ### 特点 - **模块化**:程序被分解成独立、可管理的部分。 - **抽象**:关注事物的本质特征,忽略次要特征。 - **信息隐藏**:通过封装机制隐藏实现细节。 - **代码复用**:通过继承机制提高代码利用率。 - **灵活性扩展性**:多态支持程序的灵活性,易于扩展新的功能而不影响现有代码结构。 此外,面向对象编程还强调了过程抽象和数据抽象的概念,其中数据抽象是面向对象分析的核心原则,它强调把数据和操作结合在一起,使得对象外部只知道它做什么,而不必知道它是如何做的[^3]。 ```java // Java示例:定义一个简单的类 public class Person { private String name; // 私有属性 // 构造器 public Person(String name) { this.name = name; } // 公共方法,用于获取name属性 public String getName() { return name; } // 公共方法,用于设置name属性 public void setName(String name) { this.name = name; } } // 使用Person类 public class Main { public static void main(String[] args) { Person person = new Person("Alice"); System.out.println(person.getName()); // 输出: Alice person.setName("Bob"); System.out.println(person.getName()); // 输出: Bob } } ``` 上述代码展示了如何定义一个`Person`类以及如何创建它的实例并调用其方法。这个例子体现了封装的原则,因为`name`属性被设为私有,只能通过公共的方法来访问或修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值