28从零开始学Java之面向对象和面向过程到底有哪些区别?

2023-05-16

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦

千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

壹哥相信,经过你对前面文章中技术点的学习,现在的你应该已经对Java具备了初步的了解和掌握,这为我们继续往后学习奠定了良好的基础。我们知道,Java是面向对象的编程语言,但是至今仍有不少同学还不太懂”面向对象“的确切含义。难道面向对象就是”面对着自己的对象“,那我没对象咋办?那么从今天这篇文章开始,壹哥就带大家真正地认识面向对象,Let’s go!

-----------------------------------------------前戏已做完,精彩即开始---------------------------------------------

全文大约【2000】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

配套开源项目资料

Github:

GitHub - SunLtd/LearnJava

Gitee:

一一哥/从零开始学Java

一. 面向对象

既然我们要学习面向对象,那首先得对其基本概念、特性、对象、类等内容有所了解。

1. 概念

我们知道Java是面向对象的编程语言,所以首先壹哥得给大家解释一下到底啥是面向对象编程。

所谓的面向对象编程(Object-Oriented Programming,简称OOP),其实是一种软件开发思想,也是一种编程范式。在面向对象的编程思想出现之前,主要是面向过程这种思想垄断着程序员们的编程思维。”面向“这个词,从字面理解就是”对着、朝向“,准确地说应该是”遵从、依照、按照、根据“的意思。”对象“,并不是指你的男/女朋友那个”对象“,而是指真实世界中的一个个实体,有点类似于哲学中”抽象“与”具体“范畴中的一个个”个体“。

可以说,在面向对象的编程规范中,“一切皆对象”,对象就是面向对象编程的核心。我们把现实世界中的一个个对象或物体,抽象地体现在编程世界中。就好比我们想驾驶一辆奥迪A6,A6就是一个对象,制造商给A6赋予了各种功能和特性,我们就可以调用这个对象完成一系列操控。所以每一个对象都可以包含一系列具体的操作,最终一个个的对象又组成了完整的Java程序。这些对象可以是独立存在的,也可以是从别的对象中继承过来的。对象之间通过相互作用传递信息,实现程序开发。

壹哥给大家举个栗子,假如我们想吃饭,按照面向对象的解决思维就是:

  1. 创造一个“农民”对象,去种地;
  2. 创造一个“厨师”对象,去做饭;
  3. 创造一个“食客”对象,去吃饭;
  4. ......

问题解决!

2. 特点

在面向对象编程中,一个对象会有以下特点:

  • 对象具有属性和行为;
  • 对象具有变化的状态;
  • 对象具有唯一性;
  • 对象都是某个类的实例;
  • 一切皆对象,真实世界中所有的事物都可以视为对象。

当然,如果只是这样跟大家解释一通,很多小白肯定还是不明白到底啥是面向对象。别急,面向对象是一种认知思维,一种思维的养成,并不是一朝一夕就可以形成的。有些科班出身的Java程序员,在学校里接触了很久的面向对象,甚至都做了几年的开发,真让他解释啥是面向对象,他依然很懵懂。我们要想真正地理解面向对象,只看几篇文章和视频是很难吃透的。你需要进行大量的编程实践,写着写着,有一天你就会突然顿悟:“啊,原来这就是面向对象啊”!

二. 面向过程

在上面的小节中,壹哥还给大家提到了“面向过程”这个概念,虽然这不是我们要掌握的内容,但我觉得还是有必要跟大家拓展解释一下。

1. 概念

面向过程(Procedure-Oriented Programming,简称POP)也是一种编程思想和模式它出现的时间比面向对象还要早,可以说是早期高级编程语言所采用的思维鼻祖。采用面向过程思维的编程语言有C、Fortran、Pascal、Basic等。

面向过程的编程思想其实很机械粗暴,所有的事情都可以拆分成一系列要执行的计算步骤,通常采用自上而下、顺序执行的方式来实现。还是给大家举吃饭的栗子,如果是按照面向过程的解决思维就是:

  1. 开垦荒地;
  2. 种粮种菜;
  3. 收获加工;
  4. 做饭烹饪;
  5. 开始吃饭;
  6. 收拾整理;
  7. .......

你看,整个执行逻辑就是这么机械粗暴,简单明了。面向过程就是把目标的实现拆分成了一个个的实现过程,而每一步又可以继续拆分成若干个子步骤。这种解决问题的思维,与面向对象是有明显不同的。

2. 特点

根据以上分析,我们可以感受到面向过程的优点在于,性能上它比面向对象要高。因为在面向对象中,我们在调用类时需要进行实例化,开销比较大。但面向过程的缺点也很明显,代码不易维护、复用和扩展性都很差,开发效率较低。所以面向过程的开发技术,主要是用在单片机、嵌入式开发、Linux/Unix等对性能要求较高,代码改动不频繁的场景中。

3. 面向对象与面向过程的对比

面向过程的解决思维是“步骤化”的解决问题就是分析出实现一个需求所需要的步骤,通过函数(方法)一步一步地去实现,接着我们依次调用这些函数即可。

而面向对象的解决思维是“行为化”的。就是把整个需求按照特点、功能划分,将存在共性的部分封装成类。类实例化后就是对象,创建对象不是为了完成某一个步骤,而是为了描述某个事物在解决问题时的行为。按照这种思维,项目代码就很容易维护、复用、扩展,并且系统会更加的灵活。

------------------------------------------------​​​​​​​正片已结束,来根事后烟----------------------------------------------

三. 结语

至此,壹哥就给大家解释了面向对象和面向过程的概念,并对比了两者的区别,你现在知道什么叫做面向对象了吗?

在下一篇文章中,壹哥会给大家讲解面向对象中最基本、最重要的组成单元:类和对象,大家不要错过哦。如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

四. 配套视频

如果你不习惯阅读技术文章,或是对文中的技术概念不能很好地理解,可以来看看壹哥帮你筛选出的视频教程。与本文配套的Java学习视频,链接如下:

bilibili html5 player

五. 今日作业

1. 第一题

评论区说说你对面向对象的理解。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

28从零开始学Java之面向对象和面向过程到底有哪些区别? 的相关文章

  • 如何克服原语按值传递的事实

    我有一段很长的代码来计算两个值 doubles 对我来说 我在几个地方使用了这段代码 为了坚持 DRY 原则 我应该将这段代码重构为一个很好的单元测试方法 但是我不能让它返回两个双精度数 而双精度数是原始的 因此不能按值传递和操作 我能想到
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • Hibernate.createBlob() 方法从 Hibernate 4.0.1 开始已弃用,并移至 Hibernate.getLobCreator(Session session).createBlob()

    Method Hibernate createBlob 已弃用自休眠4 0 1并搬到Hibernate getLobCreator Session session createBlob 任何解决方案我应该在方法内传递什么getLobCrea
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 如何使用 Maven 打包并运行具有依赖项的简单命令行应用程序?

    我对 java 和 Maven 都是全新的 所以这可能非常简单 如果我遵循maven2hello world此处的说明 http maven apache org guides getting started maven in Five m
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi

随机推荐