面向对象编程的艺术:构建高效可扩展的软件

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 面向对象编程的定义和背景
    • 面向对象编程与其他编程范式的区别
  • 二、面向对象编程的核心概念
    • 对象和类
    • 封装、继承和多态
  • 三、面向对象编程的优势和注意事项
    • 优势
    • 注意事项

一、引言

面向对象编程的定义和背景

面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将数据和操作这些数据的代码封装在一起,形成一个对象。对象是一个包含数据和操作这些数据的函数的实体

OOP 的核心概念包括对象、类、封装、继承和多态

  • 对象是一个包含数据和操作这些数据的函数的实体。
  • 类是一个模板,用于创建具有相同属性和方法的对象。
  • 封装是将数据和操作这些数据的函数封装在一起,以保护数据的隐私。
  • 继承是从一个类继承属性和方法,并将其应用于另一个类。
  • 多态是指不同的对象可以对相同的消息做出不同的响应。
    在这里插入图片描述

OOP 起源于 20 世纪 60 年代的计算机科学研究,当时研究人员开始意识到传统的编程方式存在一些问题。传统的编程方式通常将数据和操作这些数据的代码分开,这使得代码难以维护和扩展。OOP 的出现解决了这些问题,因为它将数据和操作这些数据的代码封装在一起,形成一个对象。这种封装使得代码更加模块化,易于维护和扩展。

OOP 已经成为现代编程中的一种主流编程范式,被广泛应用于各种编程语言,如 Java、Python、C++ 等。它的优点包括代码重用性高、易于维护和扩展、代码更加清晰和易于理解等。

面向对象编程与其他编程范式的区别

编程范式面向对象编程(OOP)过程式编程函数式编程
数据和操作的组织方式数据和操作被封装在对象中数据和操作是分开的,通过函数调用进行交互数据和操作通过函数进行处理
数据封装支持不支持支持
继承和多态支持不支持不支持
代码复用通过对象和类实现通过函数和模块实现通过函数和高阶函数实现
代码可维护性较好较好较好

需要注意的是,这些编程范式并不是互斥的,它们可以在同一项目中结合使用。选择哪种编程范式取决于项目的需求和目标。

二、面向对象编程的核心概念

对象和类

对象和类是面向对象编程(Object-Oriented Programming,OOP)中的两个重要概念。

  • 对象是一个包含数据和操作这些数据的函数的实体。它是类的实例,可以被创建、修改和销毁。对象具有属性和方法,属性是对象的数据,方法是对象的操作。例如,在一个学生管理系统中,学生可以被视为一个对象,它具有姓名、年龄、性别等属性,以及注册、选课、查询成绩等方法。
  • 类是一个模板,用于创建具有相同属性和方法的对象。类定义了对象的结构和行为,它包含了对象的属性和方法的声明。类可以被继承和扩展,以创建具有更复杂行为的对象。例如,在学生管理系统中,可以定义一个学生类,它包含了学生的属性和方法的声明。然后,可以通过创建学生类的实例来创建具体的学生对象。

类和对象之间的关系类似于蓝图和实际产品之间的关系。类定义了对象的结构和行为,而对象是类的实例,它具有类中定义的属性和方法。通过创建类的实例,可以创建具有相同结构和行为的多个对象,从而提高代码的复用性和可维护性。

以下是一个简单的 JavaScript 代码示例,展示了如何创建对象和类:

// 创建一个学生对象
var student = {
  name: "John",
  age: 18,
  gender: "Male"
};

// 打印学生对象的信息
console.log(student.name + " is " + student.age + " years old and is " + student.gender);

// 创建一个学生类
function Student(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
}

// 创建一个学生类的实例
var student1 = new Student("Alice", 16, "Female");

// 打印学生类实例的信息
console.log(student1.name + " is " + student1.age + " years old and is " + student1.gender);

在上面的示例中,我们首先创建了一个名为 student 的对象,其中包含了学生的姓名、年龄和性别信息。然后,我们使用 console.log 函数打印了学生对象的信息。

接下来,我们创建了一个名为 Student 的类,该类包含了三个属性:nameagegender。我们使用 new 关键字创建了一个 Student 类的实例 student1,并为其属性赋值。最后,我们使用 console.log 函数打印了学生类实例的信息。

封装、继承和多态

封装、继承和多态是面向对象编程(OOP)的三个重要特性,它们可以帮助我们构建更加灵活、可扩展和可维护的代码。

  • 封装(Encapsulation)是指将对象的属性和方法封装在一起,形成一个独立的单元。对象的内部细节对外部世界是隐藏的,只能通过对象的公共接口(属性和方法)来访问对象的内部状态。封装可以保护对象的内部状态不受外部干扰,提高代码的安全性和可靠性。
  • 继承(Inheritance)是指一个类可以从另一个类或多个类中继承属性和方法。继承可以提高代码的复用性,减少代码的重复编写。子类可以继承父类的属性和方法,并可以根据需要进行扩展和修改。
  • 多态(Polymorphism)是指不同的对象可以对同一消息做出不同的响应。多态可以提高代码的灵活性和可扩展性。在面向对象编程中,多态通常通过继承和方法重载来实现。

下面是一个简单的 JavaScript 代码示例,展示了封装、继承和多态的使用:

// 创建一个父类 Person
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 创建一个子类 Student,继承自 Person
function Student(name, age, major) {
  Person.call(this, name, age);
  this.major = major;
}

// 继承 Person 的属性和方法
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

// 重写 Person 的方法
Student.prototype.introduce = function() {
  return "我是" + this.name + ",今年" + this.age + "岁,我的专业是" + this.major;
};

// 创建两个子类的实例
var student1 = new Student("Alice", 18, "计算机科学");
var student2 = new Student("Bob", 20, "物理学");

// 打印子类实例的信息
console.log(student1.introduce()); // 输出:我是Alice,今年18岁,我的专业是计算机科学
console.log(student2.introduce()); // 输出:我是Bob,今年20岁,我的专业是物理学

在上面的示例中,我们创建了一个名为 Person 的父类和一个名为 Student 的子类。子类 Student 继承了父类 Person 的属性和方法,并通过 Person.call 方法将父类的构造函数应用于子类的实例。然后,我们使用 Object.create 方法创建了一个新的 Student 原型对象,并将其赋值给 Student.prototype,以实现继承。

接下来,我们重写了父类的 introduce 方法,使其能够根据子类的实例属性返回不同的介绍信息。最后,我们创建了两个子类的实例 student1student2,并调用它们的 introduce 方法来打印介绍信息。

通过这个示例,我们可以看到封装、继承和多态的使用。封装通过将对象的属性和方法封装在一起,保护了对象的内部状态。继承通过子类继承父类的属性和方法,实现了代码的复用。多态通过不同的对象对同一消息做出不同的响应,提高了代码的灵活性和可扩展性。

三、面向对象编程的优势和注意事项

优势

  • 代码复用
  • 可维护性
  • 扩展性
    在这里插入图片描述

注意事项

  • 对象设计的复杂性
  • 性能考虑
  • 代码可读性

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

震坤行:数字驱动食品农副行业采购的新兴趋势与实践

震坤行:数字驱动食品农副行业采购的新兴趋势与实践 近年来消费者对于营养价值和健康的追求日益凸显,促使各类有机食品、低糖低脂食品、素食等健康食品受到热烈追捧。同时,以往单一的产品也被各家企业“卷”出了个性化,光是卖水&a…

单片机----汇编语言入门知识点

目录 汇编语句的格式 汇编语句的两个基本语句 子程序的调用 查表程序设计 1.x和y均为单字节数的查表程序设计 2.x为单字节数y为双字节数的查表程序设计 3.x和y均为双字节数的查表程序设计 分支转移程序设计 1.单分支选择结构 2.多分支选择结构 循环程序设计 (1) 计…

成倍提高生产力工具Notion

成倍提高生产力工具Notion Notion已经成为了很多内容创作者的唯一生产力工具,甚至很多企业已经把Notion当作他们的唯一的工作平台,学习这款软件不仅能提高你的工作效率甚至在职场上也会成为一个吃香的技能,在美国有人制作销售Notion模板&…

nvm安装管理nodejs版本

1:如果之前先安装了nodejs先卸载nodejs 2:下载nvm,点击下载路径https://github.com/coreybutler/nvm-windows/releases,选择相应环境下载,如下window环境下载 下载成功后,选择NVM安装在哪个文件目录下&…

linux(3)之buildroot配置软件包

Linux(3)之buildroot配置软件包 Author:Onceday Date:2023年11月30日 漫漫长路,才刚刚开始… 参考文档: Buildroot - Making Embedded Linux Easymdev.txt docs - busybox - BusyBox: The Swiss Army Knife of Embedded Linu…

PostgreSQL-shared_buffers(双缓存)

关于shared_buffers 这是一篇2018年写的,可以结合shared read一起看 什么是shred_buffer,我们为什么需要shared_buffers? 1.在数据库系统中,我们主要关注磁盘io,大多数oltp工作负载都是随机io,因此从磁盘获…

【学习记录】从0开始的Linux学习之旅——应用开发(helloworld)

一、概述 Linux操作系统通常是基于Linux内核,并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程,具有强大的网络功能和良好的兼容性。本文主要讲述如何在linux系统上进行应用开发。 二、概念及原理 应用程序通过系统调用与…

AdWords 广告字符的限制是多少?

谷歌已经发展到不仅仅是一个简单的网络搜索。谷歌已成为任何组织所希望的最好的广告网络之一,不断有全球观众来到它研究项目和便利设施、数据、新闻、解决方案等等。 手机的变化带来了数字广告形式的初步转变,随后学习算法的发展和接受也给Google AdWor…

算法题:求所需的最小的书包数量(拓展拓展再拓展~)

算法题:求所需的最小的书包数量 现在有一种书包,这种书包只有两个书槽(即最多只能放下两本书。),并且一个这种书包只能装下N千克的书。现在有一个数组,数组元素是每本书的重量(千克&#xff09…

JavaScript基础—对象、内置对象、Math、案例分析—随机点名、猜数字游戏、生成随机颜色、网页页面渲染、堆栈

版本说明 当前版本号[20231201]。 版本修改说明20231201初版 目录 文章目录 版本说明目录JavaScript 基础 - 第5天对象语法属性和访问方法和调用null遍历对象 内置对象Math属性方法 案例分析案例一 随机点名案例二 随机点名改进案例三 猜数字游戏案例四 生成随机颜色案例五 …

使用WalletConnect Web3Modal v3 链接钱包基础教程

我使用的是vueethers 官方文档:WalletConnect 1.安装 yarn add web3modal/ethers ethers 或者 npm install web3modal/ethers ethers2.引用 新建一个js文件,在main.js中引入,初始化配置sdk import {createWeb3Modal,defaultConfig, } from…

【QuickSort】单边快排思路及实现

思路: (1)首先定义一个递归函数:qucikSort(int [ ] arr,int l,int r)。函数的定义:给定一个数组arr,对它在[l,r]这个区间内的元素进行排序,从而使得整个数组在[l,r]这个区间内有序。 &#xff0…

RFNet

表1 复现的平均值–Complete:79.218894,Core:73.4977,Enhancing:58.45406 不如论文结果,但在10个点内,还能接受 表4 复现结果–Complete:54.09826,Core:55.3…

手敲单链表,简单了解其运行逻辑

1. 链表 1.1 结构组成 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 链表的结构如下图所示,是由很多个节点相互通过引用来连接而成的;每一个节点由两部分组成,分别数据域&…

LeetCode 1205 每月交易2(PostgreSQL)

数据准备 create type state as enum(approved, declined); create table Transactions( id int, country varchar(4), state_enum state, amount int, trans_date date ); Create table If Not Exists Chargebacks ( trans_id int, trans_date date ); insert into Transac…

对小程序的初了解

WXML和HTML的区别 标签名称不同 HTML&#xff1a;div、a、span、img WXML&#xff1a;view、text、image、navigator 属性节点不同 <a href"#">超链接</a> <navigator url"/pages/home/home"></navigator> 提供了类似vue的…

HTTP协议、Java前后端交互、Servlet

文章目录 抓包工具 FiddlerHTTP 请求和响应结构URL 唯一资源定位符HTTP 协议中的方法请求报头&#xff08;header&#xff09;HTTP响应构造 HTTP 请求基于 form 标签基于 ajax使用 Postman HTTPS和 HTTP 的区别对称密钥和非对称密钥数字证书 TomcatServlet创建 Maven 项目引入依…

Linux基础项目开发1:量产工具——文字系统(四)

前言&#xff1a; 前面我们已经把显示系统&#xff0c;输入系统的框架搭建好了&#xff0c;那么有了输入和显示&#xff0c;显示的内容应该是什么呢&#xff1f;这节就要让我们一起对显示的内容&#xff0c;文字系统进行搭建。 目录 一、数据结构抽象 1.描述一个文字的位图&a…

西南科技大学(数据结构A)期末自测练习三

一、填空题&#xff08;每空1分&#xff0c;共10分&#xff09; 1、为解决计算机主机与打印机之间速度不匹配的问题&#xff0c;通常设置一个打印数据缓冲区。主机将要输出的数据依次写入缓冲区&#xff0c;打印机则依次从缓冲区中取出数据&#xff0c;则该换缓冲区的逻辑结构…

JIRA 基本使用

该页面可以&#xff1a; 查看个人基本信息以及归属的邮件组修改常用参数配置查看指给自己的 Open 问题查看自己最近的活动记录等 权限管理 Project 权限管理 JIRA 项目有三种通用权限方案&#xff1a; 公开权限方案&#xff08;默认禁止使用此方案&#xff09;&#xff1a…