如何理解面向对象编程(OOP)

2023-10-26

            想要理解OOP,首先需要清楚什么是对象。

           所谓对象就是由一组数据结构和处理它们的方法组成的,划重点 “数据” 包括对象的特性、状态等的静态信息; “方法” 也就是行为,包括该对象的对数据的操作、功能等能动信息。把相同行为的对象归纳为类,类是一个抽象的概念,对象是类的具体。简单点说:对象就是类的实例。例如:一个水果店,就是一个类,它是所有水果的集合。里面的具体水果就是对象。

           清楚了什么是对象之后,接下来就是理解什么是面向对象。

           面向对象的目的:解决软件系统的可扩展性,可维护性和可重用性;

          面向对象的三大特性:封装、多态和继承

          封装(对应可扩展性):隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。封装是通过访问控制符(public protected private)来实现。一个类就可看成一个封装。

         多态(可维护性和可扩展性)接口的不同实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口。

         继承(重用性和扩展性):子类继承父类,可以继承父类的方法和属性。可以对父类方向进行覆盖(实现了多态)。但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A关系才能使用。所以继承要慎用,尽量优先使用组合

         面向对象编程(OOP)其实就是一种设计思想,在程序设计过程中把每一部分都尽量当成一个对象来考虑,以实现软件系统的可扩展性,可维护性和可重用性。


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

如何理解面向对象编程(OOP) 的相关文章

  • 如何访问带有美元符号的 PHP 对象属性?

    我有一个 PHP 对象 其属性中有一个美元 符号 如何访问该属性的内容 例子 echo object gt variable Ok echo object gt variable WithDollar Syntax error With 变
  • 与运算符<<(操作数类型std::ostream)C++ OOP和Point不匹配[重复]

    这个问题在这里已经有答案了 我试图显示我通过成员函数创建的 Point 类的 p 对象 我已将 Point p 作为参数传递给我的程序的 void displayPoint Point p 成员函数 但我的程序中出现以下编译错误 D OOP
  • Python函数重载

    我知道 Python 不支持方法重载 但我遇到了一个问题 我似乎无法以一种很好的 Pythonic 方式解决它 我正在制作一个游戏 其中一个角色需要射击各种子弹 但是如何编写不同的函数来创建这些子弹 例如 假设我有一个函数 可以创建一颗以给
  • 信息隐藏和封装有什么区别?

    两者有什么区别信息隐藏 and 封装 我读到封装意味着将数据和对它们进行操作的过程捆绑在一起 如果是这样 下面的类是否实现了封装 class IsThisEncapsulation public int age public int get
  • 在构造函数中运行代码的不好做法可能会失败?

    我的问题更像是一个设计问题 在 Python 中 如果 构造函数 中的代码失败 则该对象最终不会被定义 因此 someInstance MyClass test123 lets say that constructor throws an
  • 对对象数组进行排序

    我在使用 PHP 手册中的示例时遇到了问题 所以我想在这里问这个 我有一个对象数组 有没有办法根据对象的内容对其进行排序 例如我的数组是 Array 0 gt stdClass Object id gt 123 alias gt mike
  • 这是 isinstance pythonic/“good” 的用法吗?

    的副作用是this https stackoverflow com questions 3110624 why typeclassinstance is returning instance 3110654 3110654问题是我被引导到这
  • 有没有办法在javascript中代理(拦截)一个类的所有方法?

    我希望能够在类本身的构造函数内代理类的所有方法 class Boy constructor proxy logic do something before each call of all methods inside class like
  • 在类中创建向量然后在函数中使用类对象不起作用

    我有课Employees 我试图让用户插入和删除员工 但它不起作用 向量的大小应为 500 class Employees public int maxx 500 vector
  • 如何使用类在 PowerShell 中实现事件处理

    我希望能够创建一个自定义事件 该事件将触发订阅该事件的函数或对象 我查看了一些功能 例如 New Event and Register ObjectEvent 但我不完全确定如何有效地将它们组合在一起 我想要的想法是让一个函数在引发某个事件
  • 替代 __del__ 来获得最终结果并终止类中的进程?

    这个虚拟类类似于我当前的项目 class EndProcess object def init self self Q multiprocessing Queue self p1 multiprocessing Process target
  • 为什么使用 staticmethod 而不是根本不使用装饰器

    关于为什么 何时应该使用类方法与静态方法 有几个很好的解释 但我无法找到何时使用静态方法而不使用任何装饰的答案 考虑一下这个 class Foo object staticmethod def f static x print static
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 如何在 Java 中创建具有相同类型参数的方法?

    我的代码如下所示 enum EnumType CATEGORY GROUP MAIN Methods public void call EnumType type switch type case CATEGORY return metho
  • std:: 对象/指针/智能指针的向量传递对象(总线错误:10)?

    我想询问一般建议 下面的代码完全编译并大致代表了我处理的代码的结构 简而言之 我想将从一个地方传递一系列从基类 Class1 派生的对象和一些其他参数到另一个地方 更准确地说 实现父类的不同子类 收集这些子类的实例并传递参数进行处理 问题是
  • 为什么Perl的SUPER调用不使用箭头方法?

    我注意到 当您调用超类的方法时 您需要执行以下操作 my self class gt SUPER new 为什么不是这样 my self class gt SUPER gt new 我怀疑是因为 class gt SUPER gt new
  • getter 和 setter 的目的? [复制]

    这个问题在这里已经有答案了 可能的重复 公共数据成员与 Getters Setters https stackoverflow com questions 2977007 public data members vs getters set
  • 全局常量是反模式吗?

    我一直认为仅仅为了保持常量而创建一个类是一个糟糕的设计 但最近 我尝试用谷歌搜索它 发现只有一个界面作为常量是不好的反模式 没有提到使用一类常量 我认为 由于常量类实际上与全局变量没有太大区别 这就是我反对它并倾向于重构此类类的原因 它创建
  • 继承php中的属性

    我有一个超类 其中包含用于设置它们的属性和方法 class Super private property function construct set this gt property set 然后我有一个需要使用该属性的子类 class
  • 从 Robot Framework 访问 python 类的变量

    我有一个 python 文件 例如 Animals py 在里面我定义了 3 个不同的类 如下所示 Animals py class Animal listAnimal dog cat lt def init self Animal con

随机推荐

  • 【论文笔记】Darts-可微神经架构搜索(一)

    是什么 darts是什么 全称 Differentiable ARchiTecture Search 它是一种新 2018 的NAS 神经架构搜索 方法 NAS是什么 全称 neural architecture search 神经架构搜索
  • JS逆向时碰到了恶心的死代码怎么办?手把手教你解决!

    文章作者 夜幕团队 NightTeam 蔡老板 Loco 润色 校对 夜幕团队 NightTeam Loco 你是否也曾有过 在逆向时看到一大坨代码 但自己却无从下手 的遭遇 你是否也曾有过 跟着代码跳了很久之后 才发现那一大坨代码其实没有
  • MySQL的运行机制是什么?它有哪些引擎?

    目录 整个 SQL 的执行流程 1 查询缓存的利弊 2 如何选择数据库引 3 InnoDB 自增主键 整个 SQL 的执行流程 首先客户端端先要发送用户信息去服务端进行授权认证 如果使用的是命令行工具 通常需要输入如下信息 mysql h
  • 《Flutter入门疑难杂症》 Flutter的UI适配方案

    本文后面已经被我用新的extension大法替代咯 有兴趣的可以看我写的这篇文章 https blog csdn net WZAHD article details 111404843 spm 1001 2014 3001 5501 话不多
  • TimeLine 的使用说明

    一 关于 TimeLine Timeline是一套基于时间轴的多轨道动画系统 它支持可视化编辑 实时预览 这一个技术相对于其他动画系统 最大的区别就是 Timeline可以针对多个游戏物体做出的一系列动画 主要用于过场动画的制作 实现电影级
  • 如何记录键盘SIGQUIT次数

    Unix信号 在计算机科学中 信号 英语 Signals 是Unix 类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式 它是一种异步的通知机制 用来提醒进程一个事件已经发生 当一个信号发送给一个进程 操作系统中断了进
  • EOS与以太坊有哪些区别?

    以太坊是一个专门为开发和运行去中心化应用 DAPP 搭建的智能合约平台 EOS与以太坊类似 同样是基于智能合约和区块链而搭建 但是 从技术和设计理念等方面来看 这两者之间实际上存在明显的区别 那么EOS和以太坊到底有什么区别呢 这个问题要从
  • 深入了解接口测试:Postman 接口测试指南

    在现代软件开发生命周期中 接口测试是一个至关重要的部分 使用 Postman 这一工具 可以轻松地进行 接口测试 以下是一份简单的使用教程 帮助你快速上手 安装 Postman 首先 你需要在电脑上安装 Postman 你可以从官网上下载并
  • python如何取0到无穷大_python如何表示无穷大

    float inf 表示正无穷 float inf 或 float inf 表示负无穷 其中 inf 均可以写成 Inf 起步 python中整型不用担心溢出 因为python理论上可以表示无限大的整数 直到把内存挤爆 而无穷大在编程中常常
  • 使用 Mapbox 在 Vue 中开发一个地理信息定位应用

    本文首发自 前端修罗场 点击加入 是一个由 资深开发者 独立运行 的专业技术社区 我专注 Web 技术 Web3 区块链 答疑解惑 面试辅导以及职业发展 博主创作的 前端面试复习笔记 点击订阅 广受好评 已帮助多人提升实力 拿到 offer
  • 20210601

    一 调整系统的共享内存上限 今天遇到创建32个大小为100MB的共享内存失败 原因是创建的共享内存总大小超过了系统允许的共享内存上限 查询系统共享内存上限的命令是 ipcs l ops g null kernel ipcs l Shared
  • nodejs原生搭建后端服务

    node nodejs原生搭建后端服务 nodejs写后端 默默的小跟班的博客 CSDN博客
  • CentOS8下安装配置Wireguard

    1 CentOS8 0服务端安装 yum update y yum install epel release https www elrepo org elrepo release 8 el8 elrepo noarch rpm yum i
  • nova policy overide (by quqi99)

    作者 张华 发表于 2023 05 19 版权声明 可以任意转载 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 Problem ExternalNetworkAttachForbidden will be thrown w
  • 【无标题】

    C bug记录 request for member endTime in something not a structure or union 粗心的时候经常遇到这个问题 但有时候就想不起来原因 这是因为对指针结构体的成员变量使用了 但应
  • 学习记录679@scp 拷贝当前主机某目录下某段时间内的文件到另一台服务器

    要按拷贝当前服务器的下的某个文件夹下的某段时间内的文件到另一台服务器 需要结合find exec scp命令 如下 我在当前主机下执行 拷贝此目录下的时间介于2020 12 24和2020 12 31之间的文件 注意不包括2020 12 3
  • Linux软件安装管理:在VMware挂载本地iso光盘镜像、配置yum软件仓库

    在操作VMware安装Linux系统后由于安装CentOS 7的最小化安装少了一些工具 比如 ifconfig 及 netstat 等 由于没问外部在线网络环境访问下载相关依赖包 则我们需要配置离线依赖库 本次操作是在Vmware上操作的
  • 在cesium中使用3D地形数据terrain builder的打开步骤

    本来题目名字叫做 大龄无经验程序员终成正果 纪念上班第三天 后加之后再 不行 必须把这篇博文发出去了 本篇用cesium terrain builder生成cesium可以使用的地形数据并用cesium terrain server发布 使
  • API函数的调用过程

    API函数的调用过程 ring3 Windows API Application Programing Interface 应用程序接口 简称API函数 Windows 有多少个API 主要是存放在C WINDOWS system32下面所
  • 如何理解面向对象编程(OOP)

    想要理解OOP 首先需要清楚什么是对象 所谓对象就是由一组数据结构和处理它们的方法组成的 划重点 数据 包括对象的特性 状态等的静态信息 方法 也就是行为 包括该对象的对数据的操作 功能等能动信息 把相同行为的对象归纳为类 类是一个抽象的概