开发语言中关于面向对象和面向过程的笔记

  • 市面主流语言分类
  • 面向过程
  • 面向对象

市面主流语言分类

  1. 面向过程编程(Procedural Programming):C语言;
  2. 面向对象编程语言(Object-Oriented Programming, OOP) :Java、C++、C#、Python;

面向过程

面向过程的程序可以视为一系列线性执行的步骤(函数或子程序),通过控制流语句(顺序、循环、分支)组织逻辑
其中,
1、面向过程的变成语言数据和操作是分离的,数据是存储在变量中的,函数独立操作这些数据。
也就是定义的子函数与变量是相互独立的,通过函数调用传递数据。
例如,先定义不同功能的函数,然后在主函数中调用该子函数,子函数的入参在主函数中定义。

   #include <stdio.h>// 定义独立函数操作数据
float circle_area(float radius) {return 3.14 * radius * radius;
}float rectangle_area(float width, float height) {return width * height;
}int main() {// 数据与函数分离float r = 5.0;float w = 4.0, h = 6.0;printf("Circle Area: %.2f\n", circle_area(r));      // 输出 78.50printf("Rectangle Area: %.2f\n", rectangle_area(w, h)); // 输出 24.00return 0;
}

面向过程的变成方法,都是从主函数开始,逐步分解任务为子过程,也就是自顶向下设计

所以,面向过程的变成的基本单元是函数(过程)
面向过程是步骤导向

面向对象

面向对象的程序由相互作用的对象构成,每个对象包含数据(属性)和行为(方法)。

// 这里定义了一个类Circle,在这个类里封装了一个变量radius和一个行为(方法)getArea。
class Circle {  private double radius; // 半径被保护  【这里的变量是private,意味着这是一个私有变量,私有意味着只能在Circle类内部访问,外部无法直接访问。所以称为“半径被保护”,这里的面向对象封装起到了数据保护的作用】//我们将半径设为私有,这样外部代码不能直接修改半径(除非通过构造方法,但构造方法只在创建对象时调用一次)public Circle(double r) { this.radius = r;this.radius = r; }  //【这里是一个公共的构造方法,这个方法的参数是r,用于在创建Circle对象时初始化半径(创建Circle类的对象)。通过这个公共方法的参数r,将r的值传递给成员变量radius,//这里的this是指当前对象,也就是使用类创建对象后,这个对象就有个这个变量,通过构造函数对这个变量进行赋值。】//【先定义类,然后类中定义构造函数,构造函数用于定义新的方法,方法通过构造函数对变量进行赋值,然后再使用定义的对象调用类中的方法】public double getArea() { // 对象自己计算【公共方法,无参数】 ,这里是行为封装 ,逻辑封装在内部,外部只需要调用该方法return 3.14 * radius * radius;  }  
}  // 这里使用 Circle 类创建了对象myCircle 
Circle myCircle = new Circle(5.0);  //【new用来创建新的对象,这里使用构造方法Circle,将5.0传递给了r。创建的对象被赋值给了Circle 类型的变量myCircle 】
//【这里需要注意,在这里进行对象初始化时即确定半径值,后续无法直接修改,如果要修改需要创建setRadius 方法】
//对象的创建步骤为:1、new 在堆内存分配空间,创建 Circle 对象实例。2、调用构造方法 Circle(5.0),初始化 radius = 5.0。3、对象地址赋值给引用变量 myCircle(栈内存存储该地址)。double area = myCircle.getArea(); // 告诉圆:"把你的面积给我"【这里的myCircle 是个对象,通过对象调用了类中的方法getArea】
//【这个例子展示了面向对象编程中的**封装特性**:将数据(半径)隐藏在对象内部,通过公共方法提供对数据的操作(计算面积)。外部代码只需要知道如何调用方法,而不需要知道内部实现细节。】

在这个例子中,定义了类Circle ,在类中定义了一个私有成员变量radius,一个构造方法Circle,一个成员方法getArea。

**【堆与栈需单独分析】**

总结面向对象的编程

类是较为顶层的设计,在类中定义各种成员,通过类定义这个类的对象。
上面例子中,通过私有的变量+公有的方法,仅暴漏接口,保障了数据的安全性,私有变量只有创建方法时定义,通过构造函数。

通俗的理解:
面向过程:是厨师,自己按步骤做菜。
第1步:拿2个番茄切块
第2步:打3个鸡蛋搅匀
第3步:开火倒油,炒鸡蛋后盛出
第4步:炒番茄,加鸡蛋混合
第5步:放盐出锅
面向对象:是餐厅老板,开一家餐厅
招专业员工(创建对象):
🧑‍🍳 厨师对象:技能 炒菜()
🧅 番茄对象:属性「颜色=红」,行为「被切块」
🥚 鸡蛋对象:属性「数量=3」,行为「被打散」
发号施令(对象交互)
厨师.处理(番茄); // 番茄自己执行"切块"
厨师.处理(鸡蛋); // 鸡蛋自己执行"打散"
厨师.炒(番茄, 鸡蛋); // 厨师调用"炒"方法

最后再做一次分析

// 抽象父类:定义公共接口
//定义抽象类Shape,抽象类不可实例化,也就不不能创建对象
//通过抽象类定义了一个模版,一个形状的模版(也可以是一个汽车的模版)
abstract class Shape {public abstract double area();//抽象类中定义抽象方法,这个方法在子类中必须被实现
}// 子类继承并实现多态
class Circle extends Shape {//子类Circle 继承了父类Shape ,因为Shape中包含抽象方法,因此在这个子类中必须实现该方法,也就是必须包含方法体
//一个普通类继承“形状”这个抽象类,定义了一个圆形,该类包含了圆形的具体实现,根据抽象类的要求,必须实现该形状的面积。private double radius;  // 封装数据。封装私有成员变量public Circle(double radius) {//构造函数this.radius = radius;}@Override//重写父类的方法area,可用户后续的多态实现,需要使用哪个便创建哪个子类的对象,结果将根据子类的不同而不同public double area() {  // 多态实现。对继承的父类中的抽象方法进行实现。return Math.PI * radius * radius;}//方法体
}class Rectangle extends Shape {//同理,这是定义了一个长方形类,该类继承了抽象类“形状”,因此在这个长方形中“面积”这个方法必须被实现private double width, height;//定义私有成员变量public Rectangle(double width, double height) {//长方形这个类的构造函数this.width = width;this.height = height;}@Overridepublic double area() {//实现抽象方法“面积”return width * height;}
}public class Main {//定义一个公有的类Mainpublic static void main(String[] args) {//定义了main方法Shape circle = new Circle(5.0);       // 父类引用指向子类对象。创建了一个对象circle ,这里的构造函数Circle引用了父类Shape的子类Circle Shape rect = new Rectangle(4.0, 6.0);//同理,再创建一个对象rect,引用了子类//多态:通过父类引用调用子类重写的方法,实际执行的是子类的方法。 System.out.println("Circle Area: " + circle.area());   // 78.54。打印对象circle的方法areaSystem.out.println("Rectangle Area: " + rect.area());   // 24.00}
}

面向对象的编程的基本单元是对象(数据 + 方法)
面向对象是角色协作

上面通过对实际代码的解析,尝试理解java的面向对象开发,对于某一个任务可以通过定义类来定义功能,后续可以直接通过构造函数创建该类的对象,对象通过调用具体方法来完成对单功能的实现。
也可以其他类通过创建该类的对象,通过构造函数,然后调用该对象中的方法,以实现具体目标
例如,这边通过多单元分工实现了多个功能类的开发,开发完成后统一由一个人创建一个类来创建各个类的对象,通过该对象调用方法达到实现某功能的目标。
也就是面向对象的编程。


整体上看,面向过程的编程更适合单体作战,一个人完成重头到尾的任务。面向过程的编程更适合集群作战,每个角色负责不同的任务,通过多体交互完成最终任务。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI产品经理面试宝典第3天:技术分层、边界与市场全景系列面试题

面试指导 面试官:请从技术实现效果的角度,解释AI技术分层。 你的回答: AI技术分为三层。 第一层是认知层:通过图像处理、语音识别、自然语言理解等技术,让机器感知环境。比如摄像头识别行人动作,麦克风捕捉用户指令。 第二层是预测层:基于行为数据预判下一步需求。例如…

Intel英特尔ICH7R/ICH8R/ICH9R/ICH10R系列下载地址--intel_msm_8961002 下载 Version 8.9.6.1002

Intel英特尔ICH7R/ICH8R/ICH9R/ICH10R系列下载地址intel_msm_8961002 下载 Version 8.9.6.1002https://xiazai.zol.com.cn/detail/66/653449.shtml通过网盘分享的文件&#xff1a;intel_msm_8961002.zip 链接: https://pan.baidu.com/s/13N9ZLXWkaWaEHQ5P90Jt0g?pwd3790 提取码…

AI(学习笔记第五课) 使用langchain进行AI开发 load documents(web)

文章目录AI(学习笔记第五课) 使用langchain进行AI开发 load documents(web)学习内容&#xff1a;1.load documents&#xff08;web&#xff09;1.1 学习url1.2 提前安装python的package1.2 使用WebBaseLoader进行webpage的load1.3 使用BeautifulSoup4进行webpage的部分截取1.4 …

使用macvlan实现容器的跨主机通信

使用环境&#xff1a; 两台运行docker的服务器 A机器网段&#xff1a;192.168.86.61 B机器网段&#xff1a;192.168.86.62 运行的容器需装有ping指令&#xff0c; 实验参数解释&#xff1a; -d macvlan 指定创建网络驱动类型 --subnet 指定子网范围 -gateway 指定网关地址 -o p…

深度学习_全连接神经网络

1.什么是神经网络神经网络中信息只向一个方向移动&#xff0c;即从输入节点向前移动&#xff0c;通过隐藏节点&#xff0c;再向输出节点移 动&#xff0c;网络中没有循环或者环。其中的基本构件是&#xff1a; 输入层&#xff1a;即输入x的那一层 输出层&#xff1a;即输出y的那…

OpenLayers使用

初学ol&#xff0c;实现了高德地图不同图层的切换、交互性地图飞行以及加载本地JSON数据。说一下不同图层切换的想法&#xff1a;1.对于标准地图和卫星地图&#xff1a;二者最初便挂载到map上&#xff0c;两个图层是叠加显示的&#xff1b;当点击按钮时&#xff0c;其实是使用 …

day4--上传图片、视频

1. 分布式文件系统 1.1 什么是分布式文件系统 文件系统是负责管理和存储文件的系统软件&#xff0c;操作系统通过文件系统提供的接口去存取文件&#xff0c;用户通过操作系统访问磁盘上的文件。 下图指示了文件系统所处的位置&#xff1a; 常见的文件系统&#xff1a;FAT16/FA…

极矢量与轴矢量

物理量分为标量和矢量&#xff0c;矢量又分为极矢量和轴矢量。 矢量是既有大小又有方向并按平行四边形法则相加的量。矢量有极矢量和轴矢量两种&#xff0c;其间的区别是在镜像反射变换下遵循不同的变换规律,许多物理量都是矢量,同样,其中也有极矢量和轴矢量的区分,在力学中,例…

文章发布易优CMS(Eyoucms)网站技巧

为了更快的上手数据采集及发布到易优CMS(eyoucms)网站&#xff0c;特地总结了些新手常常会遇到的操作问题与技巧&#xff0c;如下&#xff1a; 免费易优CMS采集发布插件下载&#xff0c;兼容火车头、八爪鱼、简数采集等 目录 1. 发布到易优CMS指定栏目 2. 发布文章到易优CM…

INA226 数据手册解读

INA226是一款数字电流检测放大器&#xff0c;配备I2C和SMBus兼容接口。该器件可提供数字电流、电压以及功率读数&#xff0c;可灵活配置测量分辨率&#xff0c;并具备连续运行与触发操作模式。该芯片通常由一个单独的电源供电&#xff0c;电压范围为 2.7V 至 5.5V引脚说明​​引…

Linux 中替换sed

以下是关于 sed&#xff08;Stream Editor&#xff09;的深度详解和日常高频使用场景&#xff0c;结合实用示例说明&#xff1a;一、sed 核心概念 流式编辑器&#xff1a;逐行处理文本&#xff0c;不直接修改源文件&#xff08;除非使用 -i 选项&#xff09;正则支持&#xff1…

ADB 调试日志全攻略:如何开启与关闭 `ADB_TRACE` 日志

ADB 调试日志全攻略&#xff1a;如何开启与关闭 ADB_TRACE 日志 ADB&#xff08;Android Debug Bridge&#xff09;是 Android 开发的核心工具&#xff0c;但在排查问题时&#xff0c;默认日志可能不够详细。通过设置环境变量 ADB_TRACE&#xff0c;可以开启 全量调试日志&…

实现druid数据源密码加密

生成加密密码集成了druid链接池的&#xff0c;可以实现数据源密码加密。加密方式如下构建单元测试&#xff0c;并输入密码即可生成加密密码以及加密公钥Test public void testPwd() throws Exception {String password "123456";String[] arr com.alibaba.druid.fi…

【TCP/IP】20. 因特网安全

20. 因特网安全20. 因特网安全20.1 安全威胁20.2 安全服务20.3 基本安全技术20.3.1 密码技术20.3.2 报文鉴别技术20.3.3 身份认证技术20.3.4 数字签名技术20.3.5 虚拟专用网&#xff08;VPN&#xff09;技术20.3.6 防火墙技术20.3.7 防病毒技术20.4 IP 层安全20.5 传输层安全20…

数据结构之位图和布隆过滤器

系列文章目录 数据结构之ArrayList_arraylist o(1) o(n)-CSDN博客 数据结构之LinkedList-CSDN博客 数据结构之栈_栈有什么方法-CSDN博客 数据结构之队列-CSDN博客 数据结构之二叉树-CSDN博客 数据结构之优先级队列-CSDN博客 常见的排序方法-CSDN博客 数据结构之Map和Se…

Web攻防-PHP反序列化魔术方法触发条件POP链构造变量属性修改黑白盒角度

知识点&#xff1a; 1.WEB攻防-PHP反序列化-序列化和反序列化 2.WEB攻防-PHP反序列化-常见魔术方法触发规则 3.WEB攻防-PHP反序列化-反序列化漏洞产生原因 4.WEB攻防-PHP反序列化-黑白盒&POP链构造 一、演示案例-WEB攻防-PHP反序列化-序列化和反序列化 什么是反序列化操作…

C# VB.NET多进程-管道通信,命名管道(Named Pipes)

要向已运行的进程发送特定命令&#xff08;如/exit&#xff09;&#xff0c;而不是启动新进程&#xff0c;需要使用进程间通信&#xff08;IPC&#xff09;机制。以下是几种常见的实现方法&#xff1a;一、使用命名管道&#xff08;Named Pipes&#xff09;如果ABC.EXE支持通过…

C++ 右值引用 (Rvalue References)

右值引用是C11引入的革命性特性&#xff0c;它彻底改变了C中资源管理和参数传递的方式。下面我将从多个维度深入讲解右值引用。一、核心概念1. 值类别(Value Categories)lvalue (左值): 有标识符、可取地址的表达式int x 10; // x是左值 int* p &x; // 可以取地址rvalue…

反激变换器设计全流程(一)——电路拓扑及工作流程

一、电路拓扑原理 拓扑结构概述 开关反激电源采用反激式拓扑结构&#xff0c;主要由开关管&#xff08;通常为 MOSFET&#xff09;、变压器、输出整流二极管、输出滤波电容以及控制电路等组成。其基本工作原理是通过开关管的周期性开关动作&#xff0c;将输入直流电压转换为高…

uniapp语音播报天气预报微信小程序

1.产品展示2.页面功能(1)点击上方按钮实现语音播报4天天气情况。3.uniapp代码<template><view class"container"><view class"header"><text class"place">地址:{{city}}</text><text class"time"&g…