热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

黑马程序员——面向对象1:理解面向对象

-------android培训、java培训、期待与您交流!----------想要理解面向对象,那么就要先知道面向过程。一、面向过程狭义上讲,“面向过程”(Pro
------- android培训、 java培训、期待与您交流! ----------
 
 

想要理解面向对象,那么就要先知道面向过程。

一、面向过程

狭义上讲,“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。广义上说,“面向过程”是一种解决问题的思想。举个例子,将大象装进冰箱里:

第一步:将冰箱门打开。

第二步:将大象装进冰箱。

第三步:将冰箱门关闭。

上述例子表明,面向过程强调的是动作,也就是说我们更为注重的是这一过程中涉及的行为——或者说功能。当我们通过不停的调用不同的功能,并通过这些功能一步一步地执行来完成某个程序时,我们就说这是面向过程的。面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法。典型的面向过程的编程语言:Basic、C等。

 

二、面向对象

面向对象(Object-oriented Programming,OOP)也是一种编程思想,事实上,面向过程是面向对象的基础。我们常说的面向对象的概念是相对于上述早期的面向过程而言的。

 

对于前述冰箱的例子,我们通过观察发现,打开\关闭冰箱门,以及存储,这些其实都是冰箱所具有的功能。这样我们就可以将上述的各种功能都定义到冰箱这一类事物中。而冰箱是实实在在存在的事物,我们将这种现实存在的事物称为对象。当我们把需要的功能定义到某一类事物(对象)中后,拥有了这个事物(对象),就拥有了它所拥有的所有功能。这就是对面向对象的一个简单的理解。

 

现在做一个对比:

面向过程:          面向对象:

打开冰箱            冰箱.打开

存储进冰箱          冰箱.存储

关闭冰箱            冰箱.关闭

 

可以看到,面向过程强调的是动作,面向对象强调的是对象。那么,也就可以看出面向过程的弊端了:随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题,而面向过程那种通过一步一步实现功能来完成程序的方式将不断增加编程的难度,开发人员可能每次都要重新定义重复使用的方法,非常麻烦,如果将这些常用的方法,定义到类当中,每当需要该类的某些方法时,只要创建该类对应的对象,然后调用对象的方法即可;或者说将现实世界的事物抽象成对象,现实世界中的关系转化为继承,帮助人们实现对现实世界的抽象与数字建模,可以大幅度提高开发效率。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。

 

三、面向对象举例

下面我们举几个例子来帮助大家更好的理解面相对象:

例一:买电脑

方式一:

1. 上网查询各种电脑的配置信息,例如CPU型号,内存大小,硬盘容量大小,显卡型号等等。

2. 锁定目标以后,搜索网友对该款产品的评价,如果满足自己的需求,就买,否则,更换目标。

3. 确定目标以后,来到电脑城,找到该款电脑品牌专卖店,并与销售进行交涉。

4. 与销售进行砍价,直到双方达成协议,并进行交易,一手交钱一手交货。

 

方式二:

1. 找到懂电脑硬件的朋友。

2. 在这位朋友的带领下来到电脑城,由他负责选择电脑型号,同时也由他负责交涉。

3. 双方谈妥以后,你负责交款即可。

 

对比上下两种方式,方法一更接近面向过程,方法二更接近面向对象。

在方式一中:首先,由于自己不懂电脑硬件,仅仅在网上搜索资料,在短时间内是无法掌握选择适合自己电脑的能力的;其次,所有的事情都要由自己来完成,比较疲惫;最终,由于不懂硬件,容易被奸商欺骗。可以说,方式一就是一个一个的函数,依次执行的过程,它强调的是动作本身。

对比方式二:由于自己不懂电脑硬件,就寻找了解电脑硬件以及购买技巧的朋友(对象),并通过调用他的选择型号和交涉的功能来完成购买电脑的目的,最终你只要负责付钱就可以。

方式二强调的是懂电脑的朋友这个对象,由你面向这个对象,并通过他的种种方法实现买电脑的目的。很明显。这种方法更为简洁方便,复用性强,代码构建与书写更为高效。

 

例二:项目开发

方式一:

1. 公司接到项目。

2. 需求分析、设计、代码体现、测试等,都由老板自己干。

3. 五年以后,开发成功,委托单位可能不存在了。

 

方式二:

1. 公司接到项目。

2. 老板雇佣很多懂得软件开发的工程师帮助完成开发。

3. 从需求分析、设计、代码体现,到最终的测试环节,分工明确,责任到位。

4. 委托单位对结果比较满意,公司信誉提升。

 

很明显,方式一是面向过程,同样,解决问题的方式就是通过一步一步的执行“过程”来完成,在这里我们其实是执行者,需要亲自负责解决所有的问题。

方式二可以说是面向对象,老板面向不同的员工,也就是面向不同的对象,通过“调用”他们不同的功能,来完成任务。那么,相对于面向过程,我们就是指挥者。

 

有了上述两个例子,我们试着直接用面向对象的思想来思考下面这个例子。

例三:去饭店吃饭

1. 来到饭店。

2. 找到服务员,“调用”服务员点菜的功能。

3. 点完菜,通过服务员作为媒介,又去调用厨师炒菜的功能。在这里,我们不关心,做菜的过程,只需要炒好菜的结果。

4. 调用服务员传菜的功能,将菜端上来。

5. 吃饭。

 

四、 面向对象总结

1、 面向对象是一种思想,是思考问题的一种方式。

2、 相对于面向过程,面向对象将复杂的事物简单化了,面向过程需要将很多方法按顺序依次执行;而面向对象,首先需要这些功能所属的对象,然后调用该对象相应的功能,但在具体执行这些功能时还是要用到面向过程的思想。

3、 角色转变:执行者à指挥者。如何理解这句话呢?比如,开门这个动作,“打开”的原理只有门自己清楚,我们作为人是不清楚其中的原理的,因此就要将打开这个动作或者功能定义在门这一类事物中。因此,打开门,其实是我们作为人去指挥门,通过调用门的打开功能,来完成开门的目的。另外,还要指出的是,在将方法封装进类之前,我们首先要分析这些功能的共性,并且确定这些功能所述的类,然后才能进行类的定义。

 

小知识点1:

如何回答,对“面向对象”的理解?

 

第一步:叙述面向对象的定义。

广义上讲,面向对象是解决问题的思想;狭义上说,面相对象是一种编程思想。

第二步:表述面向对象的特点

1. 面向对象是一种解决问题的思想。

2. 可以使复杂问题简单化。

3. 角色转变:执行者à指挥者。

 

第二步:可以举出类似于上述的实例,来加以说明(注意要符合实地场景)。

比如面试的时候,可以这么说:

1. 员工为企业工作,其实就是在使用面向对象的思想。

2. 公司就是指挥者,我们员工就是对象。

3. 公司通过调用员工(对象)的不同功能,并将这些功能进行不同的组合,来完成一个个项目。在这个过程总,公司实现盈利,员工实现自己的价值。

当然,本人除了软件开发功能,还有诸如与人沟通的能力、组织协调的能力等等,可以应对各种困难。

 

五、 面向对象具体的实现步骤

完成需求时:

1、 先要去找具有所需的功能的对象来用。

2、 如果该对象不存在,那么创建一个具有所需功能的对象。

3、 调用该对象的各个方法来实现功能。这样简化开发并提高了代码的复用性,我们自己可以使用这个对象,其他开发者也可以使用这个对象。

 

举例:公司招聘

1.  寻找具有相关开发经验技能的人才(寻找具有相关功能的对象)。

2.  如果找到,就雇佣这个人才,并使其帮助公司完成项目(找到对象,并调用相关方法)。

3.  如果没有找到,就在公司内部进行培养,同样可以完成项目(没有相关对象,就创建一个符合需求的对象,并将相关功能定义到对象内部)。

 

小知识点2:

当我们面对日常生活中的事物时,应该如何用面向对象的思想去思考呢?例如,人开车。此时,我们可以使用名词提炼法——也就是说,将一个事件当中的所有的名词提炼出来,并“封装”成对象来看待,并分析他们之间的关系。

以上述“人开车”为例,这句话中,共有两个名词。分别是“人”和“车”。可以将人和车分别理解为两个对象。然后,在这两个事物之间时通过一个动作——“开”,使两个事物之间产生了联系。这时就有了一个问题,我们应该将“开”这个动作(或者说这个功能)定义在哪个对象内呢?谁最清楚这个动作是如何发生的,就将这个动作定义到谁的内部。那么,汽车本身最“清楚”汽车内部的运作原理,因此应该将“开”这个动作定义在车的内部。这是一个非常直观并且易于理解的方法。下面是代码体现:

class Car
{
publicvoid startEngine()
{
System.out.println("启动引擎");
}
publicvoid foreward()
{
System.out.println("前进");
}
}

class Person{
public void drive(Car c)
{
c.startEngine();
c.foreward();
}
}

class Demo
{
public static void main(String[] args)
{
PersOnp= new Person();
p.drive(newCar());
}
}

上述代码的运行结果:

启动引擎

前进


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
author-avatar
我是黄小果1960
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有