面向对象的理解

news2024/9/28 11:24:28

想要对象了?没问题,new一个就好了。
但是,new太多对象,对象也会生气的哦。
你瞧,她来了

图片

从两段代码发现端倪

我们来计算一个矩形的面积,看看这两段代码有什么区别呢?

第一段:

const height = 3;const width = 5;let aaa = 123;let bbb = 456;let ccc = 789;// 定义一个函数,根据长宽计算矩形面积function calculateRectangleArea(height, width) {    return height * width;}//调用函数,得到一个结果const area = calculateRectangleArea(height, width);console.log(`面积为: ${area}`);

第二段:​​​​​​​

let aaa = 123;let bbb = 456;let ccc = 789;// 面向对象方式 - 矩形类class Rectangle {    constructor(height, width) {        this.height = height;        this.width = width;    }    calculateArea() {        return this.height * this.width;    }}const rectangle = new Rectangle(3, 5);const area = rectangle.calculateArea();console.log(`面积为: ${area}`);

有什么区别呢?区别呢?

第一段代码是面向过程的写法,第二段是面向对象的写法。其中很多相同的点,变量、函数、函数调用,无论是面向过程还是面向对象,这些基本的调用逻辑还是要有的。面向对象与面向过程的区别又在哪呢?

1.  第一个区别,是否是一个整体。第一段代码中变量是散乱的,只有调calculateRectangleArea函数的时候,才把、宽、高、面积建立了联系。而第二段代码则一开始就用矩形把宽和高绑定到一起,通过初始赋值(构造函数参数)将这个矩形定型为高为3宽为5的的矩形,这样长、宽就在一个整体中了。

2.  第二个区别,是编程思路的区别。在第一个区别的基础上,第一段代码需要按照书写顺序来理解代码。从编程人的视角来看,我们面向的就是从上到下运行的这样一个过程,简称面向过程。而第二段代码,我们先创造了一个整体,一个矩形的整体,再操作这个整体。这个"整体"在英文中叫做Object,中文翻译就有"对象"。当我们面向某一个整体编程的时候,我们就把这种编程思路叫做面向对象。也可以理解为面向(具象、万物、任何),因为对象可以代表任何具体的事物。

怎样算作对象?

非书面说法,设定属性后的那个实际的整体,被称作为对象。来看代码​​​​​​​

class Rectangle {    constructor(height, width) {        this.height = height;        this.width = width;    }    calculateArea() {        return this.height * this.width;    }}

Rectangle这个是对象吗?height是吗?width呢?

都不是,这只是说一个矩形应该要有宽和高,只是设想、概念亦或者是模板。仅凭这些属性,无法描述某一个真实的、具体的矩形。如何创建一个具象的?给他具体的值,再使用new创造一下(创建啥不都得来个动作么,比如捏个泥人的是不是得捏),来看代码​​​​​​​

const r1 = new Rectangle(100,200)const r2 = new Rectangle(6,6)

通过new这个关键字结合具体的属性值,我们得到了两个具象的实际的整体(实体)。这两个实体虽然都是矩形类型的,但很容易分辨,一个是100*200的矩形r1,另一个是6*6正方形的特殊矩形r2,对象就这样产生了,这两个实体就是对象,创建的过程叫做实例化

那么,还要问个问题,是不是说r1,r2 这两个变量就是对象?

答案是否定的,这两个变量不是对象(至少此时此刻不能这样叫),真正的对象我们看不见、摸不着、操作不了的,创建的时候他在内存中,没有名字。来看代码

new Rectangle(123,333)

这条语句执行之后,必然也会创建出来一个对象,只不过没有给他指定任何名字,也就无法使用。类比刚降生的可爱的小宝宝,如果不给他起名字他就不存在了吗,他是实实在在存在的。想要跟他互动,引起ta的注意就要给他起个名字,避免和旁边其他的人混淆。r1、r2也是如此,用 r1、r2来表示创建出来的对象,方便使用,当然如果你了解这个过程了,我们以后也可以称作r1、r2为对象,了解了内在逻辑,怎么叫就都可以了

什么是面向对象

面向对象(Object-Oriented,简称OOP)是一种编程范式或方法论,用于组织、设计和实现计算机程序。面向对象编程的核心思想是将程序中的数据(对象)和操作(方法)组合成一个个独立的、可重用的模块,这些模块可以通过定义类和实例化对象的方式来创建。面向对象编程的主要目标是提高代码的可维护性、可扩展性和可重用性。

面向对象编程有以下几个主要概念:

构造函数,也叫做类(Class):构造函数是一个模板,用于定义对象的属性(数据成员)和行为(方法)。它描述了对象的基本结构和行为。类可以看作是创建对象的蓝图。

对象(Object):对象是类的一个实例,具有类定义的属性和行为。每个对象都是独立的,有自己的状态和行为。

封装(Encapsulation):封装是将数据和方法(行为)组合到一个单元中,通过访问权限控制来隐藏内部实现的细节。这可以提高代码的模块化和隔离性,减少了代码之间的耦合。在js中封装相对来说比较不好实现。es6中使用#定义内部属性,这个属性就不会被外部访问到

继承(Inheritance):继承允许一个类从另一个类派生,从而继承其属性和方法。派生类可以扩展、修改或覆盖基类的功能,实现代码的重用和扩展。es6中使用extends关键字来实现

面向对象的好处

不聊书面用语,用例子来看

const arr = new Array()

这是一个很常见的创建数组的方式,使用一个内置构造函数(类)Array ,通过 new的方式我们创建出来了一个实例对象,我们叫他arr,这个arr有很多方法,比如push、pop、shift、unshift等,这些是数组独有的方法

再看

let str1 = "qfedu"

这个 str1 对象是字符串类型的实例,它拥有多个方法,比如 split、toLowerCase 等,然而与数组不同,str1 对象无法使用像 push、pop、shift 等数组特有的方法。一个类型的实例对象只能调用其所属类的方法。

每个类,都很专业。一个类只负责一种特定的功能或任务,这个原则通常被称为 "单一职责原则"。这就是面向对象的好处。接下来,继续介绍一些其他的好处。

积木式构建:就像搭积木一样,你可以将不同的类视为构建块,每个类都代表一个独立的功能或特性。通过将不同的类组合在一起,你就像是在搭建一个功能丰富的结构,每个类都负责一部分功能,最终形成一个完整的应用程序。

灵活组合:类似于积木的组合方式,不同的类可以以多种方式组合来实现不同的功能。你可以通过创建不同的类的实例,将它们组合成更大的对象,形成复杂的数据结构,从而实现更复杂的功能。这种组合方式可以根据需要灵活调整,实现不同的行为。

逐步扩展:就像你可以逐步添加积木块来扩展你的创意作品一样,你可以通过逐步添加新的类来扩展你的应用程序的功能。这种逐步添加功能的方式,使得你可以根据需求逐步完善和扩展应用,而不必一次性处理所有功能。

功能定制:类似于选择不同类型的积木块来创造不同的形状,你可以选择不同的类来实现不同的功能。每个类都代表一个特定的功能单元,你可以根据需要选择并组合不同的功能单元,定制出符合要求的应用程序。

总的来说,将面向对象编程比作摆积木一样的构建过程,强调了代码的组合性、可维护性和灵活性。通过将不同的类组合在一起,你可以构建出功能丰富且高度可定制的应用程序,就像用积木搭建出各种形状和结构一样。这种比喻可以帮助你更好地理解面向对象编程的优势和应用。

那么,现在找到对象了吗?祝小伙伴们都找到称心如意的对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/929277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并发-线程池

阻塞队列 笔记地址 点击进入 队列:先进先出 限定在一端进行插入,一端进行删除 出队为队头,入队为队尾 阻塞队列 BlockingQueue Queue接口继承Collection接口添加元素:add(),队列满了对抛出异常offer(),队…

【二分】搜索旋转数组

文章目录 不重复数组找最小值,返回下标重复数组找最小值,返回下标不重复数组找target,返回下标重复数组找target,返回bool重复数组找target,返回下标 不重复数组找最小值,返回下标 class Solution {public …

js中作用域的理解?

1.作用域 作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合 换句话说,作用域决定了代码区块中变量和其他资源的可见性 举个例子 function myFunction() {let inVariable "函数内部变量"; } myFunction();//要先执行这…

SOLIDWORKS提高装配效率的方法:随配合复制

SOLIDWORKS用户在工程装配设计中会经常遇到这样的问题,在同一个装配体中某个零件需要调入多次,虽然装配位置可能不同,但是配合方式基本一致,传统的方法是多次插入该零件,然后添加配合关系,过程比较繁琐&…

多传感器时间同步

文章目录 存在的问题可能的解决方法 存在的问题 不同的传感器记录的时间存在差异,若是不进行同步操作,会导致融合结果异常,这是我可视化后的轨迹,存在大幅度抖动。 未同步的imu和gps融合 gps轨迹 可能的解决方法 在ROS中&am…

vite+vue3配置环境变量

首先在项目根目录添加环境文件,比如有测试环境、开发环境、生产环境: 环境说明 .env:所有环境都会加载.env.development:开发环境加载.env.production:生产环境加载.env.test:测试环境加载 语法说明 变量…

《存储IO路径》专题:数据魔法师DMA

初识DMA 大家好,今天我要给大家介绍一位在计算机世界中不可或缺的魔法师——DMA(Direct Memory Access)。让我们一起揭开这位魔法师的神秘面纱,看看它是如何让数据在内存之间自由穿梭的。 DMA这位魔法师可是大有来头。在现代计算机系统中,CPU、内存和各种设备之间需要进…

【微服务】05-网关与BFF(Backend For Frontend)

文章目录 1.打造网关1.1 简介1.2 连接模式1.3 打造网关 2.身份认证与授权2.1 身份认证方案2.1.1 JWT是什么2.1.2 启用JwtBearer身份认证2.1.3 配置身份认证2.1.4 JWT注意事项 1.打造网关 1.1 简介 BFF(Backend For Frontend)负责认证授权,服务聚合,目标…

TMS FlexCel Studio for VCL and FireMonkey Crack

TMS FlexCel Studio for VCL and FireMonkey Crack FlexCel for VCL/FireMonkey是一套允许操作Excel文件的Delphi组件。它包括一个广泛的API,允许本机读取/写入Excel文件。如果您需要在没有安装Excel的Windows或macOS机器上阅读或创建复杂的电子表格,Fle…

skywalking服务部署

一、前言 Apache SkyWalking 是一个开源的分布式跟踪、监控和诊断系统,旨在帮助用户监控和诊断分布式应用程序、微服务架构和云原生应用的性能和健康状况。它提供了可视化的分析工具,帮助开发人员和运维团队深入了解应用程序的性能、调用链和异常情况 …

spring整合MybatisAOP整合PageHelper插件

一,spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成,以实现更便捷的开发和管理。在集成过程中,Spring 提供了许多特性和功能,如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

C++笔记之静态成员函数可以在类外部访问私有构造函数吗?

C笔记之静态成员函数可以在类外部访问私有构造函数吗? code review! 静态成员函数可以在类外部访问私有构造函数。在C中,访问控制是在编译时执行的,而不是在运行时执行的。这意味着静态成员函数在编译时是与类本身相关联的,而不…

Linux(基础篇一)

Linux基础篇 Linux基础篇一1. Linux文件系统与目录结构1.1 Linux文件系统1.2 Linux目录结构 2. VI/VIM编辑器2.1 vi/vim是什么2.2 模式间的转换2.3 一般模式2.4 插入模式2.4.1 进入编辑模式2.4.2 退出编辑模式 2.5 命令模式 3. 网络配置3.1 网络连接模式3.2 修改静态ip3.3 配置…

ubuntu下自启动设置,为了开机自启动launch文件

1、书写sh脚本文件 每隔5秒钟启动一个launch文件,也可以直接在一个launch文件中启动多个,这里为了确保启动顺利,添加了一些延时 #! /bin/bash ### BEGIN INIT sleep 5 gnome-terminal -- bash -c "source /opt/ros/melodic/setup.bash…

4.12 TCP 连接,一端断电和进程崩溃有什么区别?

目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机,又迅速重启 客户端主机宕机,一直没有重启 TCP连接服务器宕机和进程退出情况总结 TCP keepalive TCP 的保活机制 TCP 保活机制需要通过 socket 接口设置 S…

算法学习——递归

引言 从这个专栏开始,我们将会一起来学习算法知识。首先我们要一起来学习的算法便是递归。为什么呢?因为这个算法是我很难理解的算法。我希望通过写这些算法博客;来加深自己对于递归算法的理解和运用。当然,学习算法最快的方式便是…

一文解析block io生命历程

作为存储业务的一个重要组成部分,block IO是非易失存储的唯一路径,它的生命历程每个阶段都直接关乎我们手机的性能、功耗、甚至寿命。本文试图通过block IO的产生、调度、下发、返回的4个阶段,阐述一个block IO的生命历程。 一、什么是块设备…

Python“牵手”lazada商品列表数据,关键词搜索lazadaAPI接口数据,lazadaAPI接口申请指南

lazada平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范,lazadaAPI接口是指通过编程的方式,让开发者能够通过HTTP协议直接访问lazada平台的数据,包括商品信息、店铺信息、物流信息等,从而实现la…

安装启动yolo5教程

目录 一、下载yolo5项目 二、安装miniconda(建议不要安装在C盘) 三、安装CUDA 四、安装pytorch 五、修改配置参数 六、修改电脑参数 七、启动项目 博主硬件: Windows 10 家庭中文版 一、下载yolo5项目 GitHub - ultralytics/yolov5:…

C++笔记之智能指针和单例、依赖注入结合使用

C笔记之智能指针和单例、依赖注入结合使用 code review! 文章目录 C笔记之智能指针和单例、依赖注入结合使用例1.一个类不使用单例,另一个类使用单例例2.两个类都使用单例,并且通过getInstance()传入类的实例例3.std::make_unique不能访问私有的构造函…