面向对象的理解
想要对象了?没问题,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 等数组特有的方法。一个类型的实例对象只能调用其所属类的方法。
每个类,都很专业。一个类只负责一种特定的功能或任务,这个原则通常被称为 "单一职责原则"。这就是面向对象的好处。接下来,继续介绍一些其他的好处。
积木式构建:就像搭积木一样,你可以将不同的类视为构建块,每个类都代表一个独立的功能或特性。通过将不同的类组合在一起,你就像是在搭建一个功能丰富的结构,每个类都负责一部分功能,最终形成一个完整的应用程序。
灵活组合:类似于积木的组合方式,不同的类可以以多种方式组合来实现不同的功能。你可以通过创建不同的类的实例,将它们组合成更大的对象,形成复杂的数据结构,从而实现更复杂的功能。这种组合方式可以根据需要灵活调整,实现不同的行为。
逐步扩展:就像你可以逐步添加积木块来扩展你的创意作品一样,你可以通过逐步添加新的类来扩展你的应用程序的功能。这种逐步添加功能的方式,使得你可以根据需求逐步完善和扩展应用,而不必一次性处理所有功能。
功能定制:类似于选择不同类型的积木块来创造不同的形状,你可以选择不同的类来实现不同的功能。每个类都代表一个特定的功能单元,你可以根据需要选择并组合不同的功能单元,定制出符合要求的应用程序。
总的来说,将面向对象编程比作摆积木一样的构建过程,强调了代码的组合性、可维护性和灵活性。通过将不同的类组合在一起,你可以构建出功能丰富且高度可定制的应用程序,就像用积木搭建出各种形状和结构一样。这种比喻可以帮助你更好地理解面向对象编程的优势和应用。
那么,现在找到对象了吗?祝小伙伴们都找到称心如意的对象
相关文章:
面向对象的理解
想要对象了?没问题,new一个就好了。 但是,new太多对象,对象也会生气的哦。 你瞧,她来了 从两段代码发现端倪 我们来计算一个矩形的面积,看看这两段代码有什么区别呢? 第一段: con…...
java ssl加密发送邮件
通过25端口发送邮件不安全,改为ssl加密方式发送邮件,比较常见的2中实现类发送邮件如下所示。 1、JavaMailSenderImpl 类 使用该实现类发送邮件,ssl加密使用端口号为465,借助Properties类设置ssl的各种配置。 SysUserEntity user…...
SpringBoot-yml配置文件的使用与优势
目录 一、什么是yml配置文件? 二、如何在SpringBoot中使用yml配置文件? 三、如何在SpringBoot中注入yml配置文件的属性? Value注解 ConfigurationProperties注解 四、yml配置文件与properties配置文件的区别和优势 区别 优势 五、总结…...
Layer Normalization(层规范化)
详细内容在这篇论文:Layer Normalization 训练深度神经网络需要大量的计算,减少计算时间的一个有效方法是规范化神经元的活动,例如批量规范化BN(batch normalization)技术,然而,批量规范化对小批…...
redisson参数配置
文章目录 pom配置链接配置建议 pom <!-- 引入spring-data-redis组件 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><!-- 因springboot2.x…...
【基于Arduino的仿生蚂蚁机器人】
【基于Arduino的仿生蚂蚁机器人】 1. 概述2. Arduino六足位移台–蚂蚁机器人3D模型3. 3D 打印零件4. 组装Arduino六足位移台5. Arduino蚂蚁机器人电路图6. 为Arduino Hexapod设计PCB7. 组装电路板8. 系统代码9. Arduino蚂蚁机器人安卓应用程序在本教程中,我将向您展示如何构建…...
angular12里面FormGroup做多个项目的相关check
FromFroup在鼠标失去焦点时做相关check,可以在group方法第二个参数的位置加一个对象参数 { validator: this.checkPasswords } 在Angular 12中,可以使用formGroup来进行两个密码是否一致的检查。以下是一个示例: 首先,在组件的…...
TypeScript 的发展与基本语法
目录 一、为什么什么是TypeScript? 1、发展历史 2、typescript与javascript 3、静态类型的好处 二、基础语法 1、基础数据类型 2、补充类型 3、泛型 4、泛型的高级语法 5、类型别名&类型断言 6、字符串/数字 字面量 三、高级类型 1、联合/交叉类型…...
macOS - 上编译运行 risc-v (spike)
文章目录 一、说明二、安装步骤三、测试 一、说明 本文根据以下文章改编: RISC-V 环境配置 https://decaf-lang.github.io/minidecaf-tutorial/docs/step0/riscv_env.html 相关链接: riscv-gnu-toolchain GNU toolchain for RISC-V, including GCC ht…...
Linux--线程地址空间
1.程序地址空间 先来就看这张图 这是一张程序地址分布的图,通过一段代码来证明地址空间的分布情况 编译结果: 可以看出的是,父子进程中对于同一个变量打印的地址是一样的,这是因为子进程以父进程为模板,因为都没有对数…...
华为OD机试 - 最佳植树距离 - 二分查找(Java 2023 B卷 100分)
目录 一、题目描述二、输入描述三、输出描述四、备注说明五、二分查找六、解题思路七、Java算法源码八、效果展示1、输入2、输出3、说明 一、题目描述 按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。 由于…...
RNN+LSTM正弦sin信号预测 完整代码数据视频教程
视频讲解:RNN+LSTM正弦sin信号预测_哔哩哔哩_bilibili 效果演示: 数据展示: 完整代码: import torch import torch.nn as nn import torch.optim as optim import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.preprocessing import…...
如何自己实现一个丝滑的流程图绘制工具(四)bpmn-js开启只读状态
背景 流程图需要支持只读状态和编辑状态 翻看官方案例源码,扒拉到了禁用的js代码 DisableModeling.js const TOGGLE_MODE_EVENT toggleMode const HIGH_PRIORITY 10001export default function DisableModeling(eventBus,contextPad,dragging,directEditing,e…...
字节跳动 Git 的正确使用姿势与最佳实践
版本控制Git 黑马&尚硅谷 Git的前世今生 方向介绍 为什么要学习Git 1.0 Git是什么 1.1 版本控制 1.1.1 本地版本控制 1.1.2 集中版本控制 1.1.3 分布式版本控制 我们已经把三个不同的版本控制系统介绍完了,Git 作为分布式版本控制工具, 虽然目前来讲…...
龙迅LT7911UX TYPE-C/DP转MIPI/LVDS,内有HDCP
1. 描述 LT7911UX是一种高性能的Type-C/DP1.4a到MIPI或LVDS芯片。HDCP RX作为HDCP中继器的上游端,可以与其他芯片的HDCP TX协同工作,实现中继器的功能。 对于DP1.4a输入,LT7911UX可以配置为1/2/4车道。自适应均衡使其适用于长电缆应用&#…...
Spearman Footrule距离
Spearman Footrule距离是一种用于衡量两个排列之间差异的指标。它衡量了将一个排列变换为另一个排列所需的操作步骤,其中每个操作步骤都是交换相邻元素。具体而言,Spearman Footrule距离是每个元素在两个排列中的排名差的绝对值之和。 这个指标的名字中…...
docker 安装 Wordpress 用lnmp搭建出现的故障
第一个故障就是mysql出现的故障了 你起mysql镜像是这么起的导致pid号用不了 docker run --namemysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 mysql:lnmp 解决方法 docker run --namemysql -d --privilege…...
【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)
阅读导航 前言一、继承的概念及定义1. 继承的概念2.继承的定义⭕定义格式⭕继承关系和访问限定符⭕继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承⭕单…...
【Spring框架】Spring事务的介绍与使用方法
⚠️ 再提醒一次:Spring 本身并不实现事务,Spring事务 的本质还是底层数据库对事务的支持。你的程序是否支持事务首先取决于数据库 ,比如使用 MySQL 的话,如果你选择的是 innodb 引擎,那么恭喜你,是可以支持…...
七夕特别篇 | 浪漫的Bug
文章目录 前言一、迷失的爱情漩涡(多线程中的错误同步)1.1 Bug 背景1.2 Bug 分析1.3 Bug 解决 二、心形积分之恋(心形面积计算中的数值积分误差)1.1 Bug 背景1.1.1 背景1.1.2 数学模型 1.2 Bug 分析1.2.1 初始代码1.2.2 代码工作流…...
手把手教你用Python3运行seeyon_exp工具,一键检测致远OA常见漏洞
手把手教你用Python3运行seeyon_exp工具进行致远OA漏洞检测 在当今企业数字化办公环境中,协同办公系统承载着大量核心业务数据,其安全性至关重要。致远OA作为国内广泛使用的办公自动化平台,近年来曝光的多个高危漏洞引起了安全从业者的高度关…...
EEG情感分析入门:如何用DEAP数据集里的脑电波区分‘开心’和‘平静’?
EEG情感分析实战:从DEAP数据集解码快乐与平静的脑电密码 当你听到最喜欢的歌曲时,大脑会产生怎样的电信号变化?神经科学研究表明,不同的情绪状态会在大脑活动中留下独特的"指纹"。本文将带你探索如何利用DEAP数据集中的…...
告别ActiveX!用WebSocket+JavaScript在Chrome/Firefox里直接调用扫描仪(附完整代码)
现代浏览器无插件扫描方案:WebSocket与JavaScript的完美结合 曾几何时,企业办公系统中扫描文档需要依赖特定的浏览器和插件。如今,随着技术演进,我们终于可以摆脱ActiveX和NPAPI的束缚,在Chrome、Firefox等现代浏览器中…...
忆阻器混沌电路设计与储层计算应用
1. 忆阻器混沌电路的设计原理与实现1.1 忆阻器的非线性特性基础忆阻器(Memristor)作为第四种基本电路元件,其核心特性在于电阻值会随通过它的电荷量历史而变化。这种"记忆"特性来源于器件内部导电细丝的形成与断裂过程。在Pt/HfO2/…...
UE材质背后的物理课:从菲涅尔到BRDF,理解PBR渲染的数学与视觉魔法
UE材质背后的物理课:从菲涅尔到BRDF,理解PBR渲染的数学与视觉魔法 当你在虚幻引擎中拖动粗糙度滑块时,是否思考过这个0到1的数值如何精确控制光线在虚拟表面的舞蹈?PBR渲染不是魔法,而是将自然界的光影规律翻译成计算机…...
Taotoken助力边缘计算场景下的智能应用开发与模型调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken助力边缘计算场景下的智能应用开发与模型调用 在工业控制、物联网网关或移动机器人等边缘计算场景中,开发者常…...
AI芯片性能优化实战:Polyhedral编译在深度学习部署中的挑战与解决方案
1. 项目概述:当AI算法遇上硬件“翻译官”最近几年,AI模型从实验室走向千家万户,从云端服务器部署到我们口袋里的手机,这个过程中有一个角色至关重要,却又常常被算法工程师们视为“黑盒”——那就是AI芯片。我们写的PyT…...
企业视频会议系统从公有云迁移到私有化环境:完整数据迁移指南
摘要:企业从Zoom、腾讯会议等公有云SaaS视频会议系统迁移到私有化部署的会议平台时,需要处理用户数据、历史会议记录、录制文件等关键资产的平滑过渡。本文提供一套经过生产验证的迁移方案,涵盖数据导出、批量导入、API对接、录制文件转存及验…...
FPGA系统时钟革新:纯硅可编程振荡器提升可靠性与设计灵活性
1. 项目概述:为什么FPGA需要一个更“稳”的时钟?在FPGA(现场可编程门阵列)的设计与应用中,时钟信号就像是整个数字系统的“心跳”。无论是高速数据采集、复杂算法处理,还是多协议通信,一个稳定、…...
大模型小白必看:收藏!揭秘京东面试官如何破解多轮RAG“越聊越蠢”的难题
本文深入剖析多轮RAG在对话场景中容易出现的问题——越聊越“蠢”,即系统无法准确理解用户意图。文章指出,主要原因是历史对话内容污染了当前检索query,导致检索偏离用户真实意图。作者提出了四点判断框架:区分四类对象、检索quer…...
