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之面向对象和面向过程到底有哪些区别? 的相关文章

  • 使用 Intellij Idea 和 gradle 在应用程序引擎上调试 localhost

    我正在使用 IntelliJ 社区添加并使用 Gradle 构建应用程序引擎标准环境应用程序 在迁移到 IntelliJ 和端点框架之前 我使用的是 Android Studio 我无法调试我的本地主机 我添加了 jvmFlags 如下所述
  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • 如何在java中将数组值排序为循环格式?

    我的数组值如下 String value 1 2 3 4 5 6 7 8 9 10 假设如果我将值 5 传递给 tat 数组 它应该按如下顺序排序 5 6 7 8 9 10 1 2 3 4 怎么办 有人帮忙吗 感谢你 你需要的就是所谓的轮换
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 如何在字段值无效的情况下更改 Struts2 验证错误消息?

    我在 Web 表单上使用 Struts2 验证 如果字段假设为整数或日期 则
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐