面向对象的基本概念和方法
面向对象的开发方法在近几十年见得以广泛应用,我们常见的Java语言就是一种典型的面向对象的开发语言。然而,面向对象的概念较为复杂,知识点也很细碎,本文整理了面向对象的基本概念和方法,供大家参考。为了便于读者理解,在解释一些定义时,笔者会通过一些例子,解释较为抽象的概念。
面向对象的概念
面向对象编程(Object-Oriented Programming,OOP)是一种编程方法,其中程序是由对象组成的。面向对象的编程的核心思想是,将程序中的实体、数据和功能抽象为单独的对象,并在这些对象之间建立联系。
面向对象方法的主要方面包括:
继承:子类继承父类的属性和方法,并可以添加新的属性和方法。
封装:对象的内部状态和行为被隐藏在对象内部,只能通过公共的方法访问。
多态:同一个方法可以有不同的实现,根据不同的对象类型而有不同的行为。
抽象:通过抽象类和接口来定义对象的公共行为,但不实现该行为。
关联:对象之间的关系,例如一对多,多对一等。
这些方面可以使程序更易于维护、扩展和重用,并使代码更具可读性和清晰度。面向对象的方法已经成为现代编程的重要方法,并应用于各种领域,如桌面应用程序、移动应用程序、游戏等。
什么是对象
对象是面向对象编程中的一个核心概念。它代表了现实世界中的一个实体或抽象概念,并将其属性和行为抽象为程序中的数据结构和函数。
例如,一辆汽车可以被表示为一个对象,其属性可以包括品牌、颜色、速度等,行为可以包括启动、加速、停止等。同样,一个学生可以被表示为一个对象,其属性可以包括姓名、年龄、成绩等,行为可以包括学习、考试等。
在面向对象编程中,通过创建对象的实例,可以实现对实体和概念的抽象,使代码更加清晰和可读。
对象的继承
继承是面向对象编程中的一个重要概念,它允许一个类继承另一个类的特性,从而减少代码的重复编写。
当一个类继承另一个类时,它会自动获得父类的所有属性和行为,并且可以在其上面扩展新的特性或覆盖父类中的某些特性。这样,就可以实现类与类之间的关系,并有效减少代码的重复编写。
例如,可以定义一个类“Animal”,其中包含了动物的基本属性和行为,然后可以定义一个类“Dog”继承自“Animal”类,其中包含了狗的特殊属性和行为。这样,就可以省去了在“Dog”类中重复编写“Animal”类中已有的代码,并且可以很方便地扩展狗的特殊特性。
对象的封装
封装是面向对象编程中的一个重要概念,它将对象的实现细节隐藏起来,只向外暴露对象的公共接口。
通过封装,可以使得对象的内部实现细节不被外部代码所依赖,从而提高代码的灵活性和可重用性。同时,还可以隐藏对象的内部状态,从而避免因为外部代码对对象状态的不正确使用导致的问题。
在面向对象编程中,可以通过将对象的实现细节封装在私有成员中,并通过公共接口向外暴露对象的行为,从而实现封装。例如,可以定义一个类,其中包含了某个对象的私有成员和公共接口,这样就可以实现对对象的封装。
多态的定义和分类
多态是面向对象编程中的一个重要概念,指的是同一消息可以被不同的对象响应,产生不同的行为。多态是面向对象编程的一个基本特征,是面向对象编程的重要原则之一。
运行时多态和编译时多态
多态分为两类:
运行时多态:也称为动态多态,是通过继承和接口实现的。在运行时,程序根据对象的实际类型来决定其行为,因此可以实现不同类型对象的不同行为。
编译时多态:也称为静态多态,是通过重载实现的。在编译时,程序根据函数的参数类型来决定调用哪个函数,因此可以实现不同参数类型对象的不同行为。
多态的好处包括:
提高代码的灵活性和可重用性,因为不同类型的对象可以通过多态的机制实现不同的行为。
提高代码的可读性和可维护性,因为多态可以将类型与行为分离,使得代码更加清晰易读。
减少程序的代码冗余,因为多态可以通过共同的接口实现不同的行为,而不需要复制相同的代码。
专用多态和通用多态
此外,多态还可以分为专用多态和通用多态,是指面向对象编程中的两种不同的多态类型。
专用多态是指一个特定的多态实现,通常是为了解决某一特定问题而特别设计的多态。它通常是针对特定的数据类型和操作实现的,并且只适用于特定的情况。
通用多态是指一种普遍适用的多态实现,通常是面向对象编程语言中的内置多态实现,可以应用于多种不同的数据类型和操作。通用多态通常是通过继承和接口实现的,可以被用于解决多种不同的问题。
总的来说,专用多态和通用多态都是面向对象编程中的重要概念,它们都可以提高代码的灵活性和可重用性。但是,通用多态的应用范围更广,因为它可以适用于多种不同的数据类型和操作。
对象的抽象
对象的抽象是指在面向对象编程中,把复杂的对象抽象成简单的对象,从而更容易理解和管理。
抽象的目的是将复杂的对象的内部结构和行为隐藏起来,只暴露必要的接口,使得程序员可以在不了解内部实现细节的情况下使用这个对象。这样可以提高代码的可读性和可维护性。
在面向对象编程语言中,抽象通常是通过继承和抽象类实现的。继承允许程序员定义一个新类,该类继承自一个已存在的类,并可以在新类中重写或添加新的方法。抽象类是一种特殊的类,它不能直接实例化,而是需要由子类来实现。
对象的关联
对象的关联关系是指在面向对象编程中,多个对象之间的联系。
关联关系分为三种:一对一关系,一对多关系,多对多关系。
一对一关系是指一个对象只和另一个对象相关联,两个对象之间是独立的。
一对多关系是指一个对象和多个对象相关联,多个对象对一个对象是依赖的。
多对多关系是指多个对象之间相互依赖,两两之间是独立的。
这些关联关系可以通过继承,聚合,组合,依赖等方式实现。
类之间的关系
类之间的关系有六种,分别是关联、组合、聚合、依赖、泛化和实现。
组合关系和聚合关系(关联关系)
这三者说得基本上是一回事。
关联关系(Association)表示两个类的实例之间存在某种语义上的联系。
聚合关系(Aggregation)表示一个类包含另一个类,聚合关系表示为一个类包含另一个类的实例。例如,有一个银行账户类,它包含了一个客户类的实例。
组合关系(Composition)表示一个类是另一个类的组成部分,组合关系表示为一个类是另一个类的组成部分。例如,有一个车辆类,它是由引擎,轮胎,方向盘等组成的。
依赖关系
依赖关系(Dependency)表明一个类依赖于另一个类,依赖关系表示为一个类需要另一个类的支持才能完成其功能。例如,有一个披萨类,它依赖于一个面团类,因为它需要面团才能制作出披萨。
这些关系都可以通过面向对象编程语言来实现,并且可以帮助我们更好地模拟实际世界中的关系。
泛化关系和继承关系
泛化关系(Generalization)和继承关系()是面向对象编程的两个重要概念,二者互为反义。
泛化关系,也称为一般化关系,是指在类层次结构中,子类的特征可以被概括为父类的特征,这样子类对象就可以当做父类对象来使用。泛化关系用箭头从子类指向父类来表示,用于表示一个类的属性和行为的概括。
继承关系(Inherit),指的是子类可以从父类继承一些属性和方法,并且可以重载或扩展这些属性和方法。继承关系是泛化关系的实现方式,也是一种代码复用的方式。
总的来说,泛化关系是一种思想上的概念,而继承关系则是一种实现的方式。在实际的编程中,泛化关系通过继承关系实现。
实现关系
类的实现关系(Implementation)是指两个类之间的关系,表示一个类对另一个类的依赖或替代关系。类的实现关系是在面向对象编程中的常见概念,常常用于描述类的内部实现方式和代码之间的关系。
统一建模语言UML
UML的定义
UML(Unified Modeling Language)是一种通用的建模语言,旨在为软件工程领域提供一种标准的、统一的建模方法。它是一种图形化的建模语言,用于描述、设计、分析和构建软件系统。
UML为软件工程师提供了许多图形化的工具,用于描述系统的功能、构造、行为和交互。这些工具可以帮助工程师更清晰地理解系统的结构和功能,以及如何在设计过程中进行沟通和协作。
UML具有强大的表示能力,可以描述多种软件工程领域的概念,如类、对象、接口、抽象类、继承、封装、多态、关联、聚合、组合、依赖等。UML图形化工具可以帮助工程师更直观地理解系统的构造和功能,从而提高系统的设计质量和开发效率。
UML的14种图
UML的图分为静态图和动态图两类:
静态图:主要描述系统的静态结构。例如类图,对象图,包图,组件图,部署图等。
动态图:主要描述系统的动态行为。例如状态图,活动图,交互图,时序图,用例图等。
UML提供了14种图形化建模工具,它们分别用于描述不同层次的系统结构和功能。下面是UML的14种图:
用例图:描述系统的功能和用户的需求
类图:描述系统的类、对象、接口、继承、实现关系
对象图:描述对象之间的关系
接口图:描述系统中接口的定义和实现
包图:描述系统的包、模块和组件之间的关系
状态图:描述系统的状态和转换
行为图:描述系统的行为和动作
活动图:描述系统的工作流程和任务的执行过程
通信图:描述系统的通信和交互
部署图:描述系统的部署和配置
时序图:描述系统的时序和时间关系
协作图:描述系统的协作和交互
实现图:描述系统的实现细节
组件图:描述系统的组件和模块的实现情况
这些图形化工具可以帮助工程师更直观地理解系统的构造和功能。
UML的架构
UML的架构是UML语言的核心部分,它定义了UML语言的模型元素和关系。UML的架构分为四个层次:
基础模型:定义了UML的基本概念,例如对象,属性,操作,关系,包等。
核心模型:定义了UML的基本图形元素,例如类,接口,继承,实现,关联,依赖等。
关系模型:定义了UML的复杂关系,例如泛化,组合,聚合,容纳,真实化等。
行为模型:定义了UML的动态图形元素,例如状态机,活动图,交互图等。
UML的架构是UML语言的核心部分,是UML语言的一个完整体系,为开发者提供了一个统一的模型元素和关系系统,可以帮助开发者更好地描述和理解系统的构建。
UML的五种视图
UML(Unified Modeling Language)是一种面向对象的建模语言,它提供了多种不同视图以描述软件系统的不同方面。
逻辑视图:描述系统的逻辑结构,包括类图、对象图等。
实现视图:描述系统的实际实现情况,包括包图、组件图等。
进程视图:描述系统的运行状况,包括活动图、状态图等。
部署视图:描述系统的部署情况,包括部署图。
用例视图:描述系统如何和用户进行交互,包括用例图。
这五种视图共同描述了软件系统的不同方面,帮助开发人员了解系统的整体结构和运行情况,提高软件开发效率。

总结
UML (Unified Modeling Language) 是一种统一的建模语言,旨在帮助开发人员在软件工程领域中更好地描述、可视化、构建和文档化软件系统。它包含了一组图形元素和规则,可以用来描述软件系统的结构和行为。
面向对象开发是一种软件工程方法,强调以对象为中心进行建模,以对象之间的关系来表示软件系统的结构和行为。面向对象开发的主要概念包括:对象、类、继承、封装、多态和抽象等。
UML 和面向对象开发相结合,可以帮助开发人员在设计阶段更好地理解系统的需求和实现方式,并能更好地沟通和协作。UML 可以用来描述面向对象系统的结构和行为,同时面向对象的开发方法可以帮助 UML 更好地实现对系统的抽象和模拟。
相关文章:

面向对象的基本概念和方法
面向对象的开发方法在近几十年见得以广泛应用,我们常见的Java语言就是一种典型的面向对象的开发语言。然而,面向对象的概念较为复杂,知识点也很细碎,本文整理了面向对象的基本概念和方法,供大家参考。为了便于读者理解…...

数据可视化大屏百度地图绘制行政区域标注实战案例解析(个性化地图、标注、视频、控件、定位、检索)
百度地图开发系列目录 数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)数据可视化大屏百度地图API开发:停车场分布标注和检索静态版百度地图高级开发:map.getDistance计算多点之间的距离并输入…...
1.面向对象和类的关系?2.什么是Promise、3.Promise和async、await的关系
面向对象:面向对象是一种编程思想(oop)。(Js里面所有的东西都可以看做对象,Js它是基于原型的面向对象语言,采用原型的方式来构造对象)很多个具有相同属性和行为的对象就可以抽象为类,对象是类的一个实例。JavaScript在…...

【程序化天空盒】过程记录01:日月 天空渐变 大气散射
1 日月 SunAndMoon 昼夜的话肯定少不了太阳和月亮,太阳和月亮实现的道理是一样的,只不过是月亮比太阳多了一个需要控制月牙程度(or添加贴图)的细节~ 1.1 Sun 太阳的话很简单,直接在shader里实现一个太阳跟随平行光旋…...
无线通信中的轨道角动量
目录 一. 前言 二. 如何传输 三. 如何产生 3.1 螺旋结构器件 (1)螺旋相位板 (2)螺旋抛物面天线 3.2 超表面 3.3 天线阵列 3.3.1 相控阵 3.3.2 时控阵 四. 如何识别 一. 前言 轨道角动量:Orbital Angular M…...

以后更新功能,再也不用App发版了!智能小程序将为开发者最大化减负
在 IoT 时代,越来越多的企业意识到打造自有 App 对于品牌的重要性。作为智能设备不可或缺的控制终端,App 具备连接用户、完善服务、精细化运营用户的独特优势,可帮助企业大大提升品牌竞争力。 为了帮助品牌企业打造更具个性化、差异化的智能…...
C++之类模板全特化和偏特化
类模板类模板是通用类的描述,使用任意类型(泛型)来描述类的定义。使用类模板的时候,指定具体的数据类型,让编译器生成该类型的类定义。注意:函数模板中可以不指定具体数据类型,让编译器自动推到…...

Python 手写数字识别 MNIST数据集下载失败
目录 一、MNIST数据集下载失败 1 失败的解决办法(经验教训): 2 亲测有效的解决方法: 一、MNIST数据集下载失败 场景复现:想要pytorchMINIST数据集来实现手写数字识别,首先就是进行MNIST数据集的下载&am…...
华为机试题:HJ61 放苹果(python)
文章目录博主精品专栏导航知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() :打印输出。3、整型int() :将指定进制…...

【论文速递】ICCV2021 - 基于超相关压缩实现实时高精度的小样本语义分割
【论文速递】ICCV2021 - 基于超相关压缩的小样本语义分割 【论文原文】:Hypercorrelation Squeeze for Few-Shot Segmentation 【作者信息】:Juhong Min Dahyun Kang Minsu Cho 获取地址:https://openaccess.thecvf.com/content/ICCV2021/…...
单例模式(Singleton Pattern)
目录 1.什么是单例模式: 2.单例模式存在的原因: 3.单例模式的优缺点: 4.创建方式: 1. 单线程单例模式立即创建(饿汉式): 2. 单线程单例模式延迟创建(懒汉式)…...

docker file和compose
文章目录1.dockerfile(单机脚本)1.概念2.原理3.dockerfile核心四步4.命令2.docker compose1.概念2.注意事项3.常用字段4.常用命令1.dockerfile(单机脚本) 1.概念 通过脚本,生成一个镜像,并运行对应的容器…...
如何解决thinkphp验证码不能显示问题?
thinkPHP做验证码这一块,可以使用自带的验证码扩展,具体步骤如下: 一、安装扩展 composer require topthink/think-captcha 二、模版中使用 将原来静态页面的验证码图片替换为{:captcha_img()},这个会自动生成验证码图片。 <div>{:captcha_img()}</div> 或者 &…...

Vue极简使用
Vue安装Vue模板语法安装Vue 安装nodejs 这里我安装的是14.5.4版本 https://nodejs.org/download/release/v14.15.4/解压后配置一下环境变量就行 安装cnpm镜像 (这个安装的版本可能过高,后面安装Vue可能出问题) npm install -g cnpm --registryhttps://registry…...

【Nacos】Nacos配置中心服务端源码分析
上文说了Nacos配置中心客户端的源码流程,这篇介绍下Nacos配置中心服务端的源码。 服务端的启动 先来看服务启动时干了啥? init()方法上面有PostConstruct,该方法会在ExternalDumpService实例化后执行。 com.alibaba.nacos.config.server.s…...

第十五章 栅格数据重分类、栅格计算器、插值分析
文章目录第十五章 栅格数据分析第一章 栅格数据重分类第一节 栅格数据重分类第二节 栅格重分类的使用第三节 重分类的使用中的空值使用第四节 重分类的案例:分类统计面积第五节 坡度矢量分级图生成第二章 栅格计算器第一节 栅格计算器介绍第二节 栅格计算器使用第三…...

CS5260测试版|CS5260demoboard|typec转VGA参考PCB原理图
CS5260测试版|CS5260demoboard|typec转VGA参考PCB原理图 CS5260是一款高度集成的TYPEC转VGA转换方案芯片。 CS5260输出端接口:外接高清VGA设备如:显示器投影机电视带高清的设备,广泛应用于 笔记本Macbook Air 12寸USB3.1输出端对外接高清VGA设备如:显示器投影机电视…...

winform开发心得
最近一直在从事winform的开发,每次都是需要从网上查找资料才能对应具体风格要求,现在总结一下。 ui方面可以使用CSkin对应的一套ui,使用步骤 1.在窗口界面,工具箱空白处点击右键,弹出菜单有个”选择项“,点…...

学习周报-2023-0210
文章目录一 在SUSE11sp3系统中将openssh从6升级到8一 需求二 系统环境三 部署流程1.上传编译安装的软件包2.安装 gcc编译软件3.安装依赖zlib4.安装依赖openssl5.安装openssh二 在CentOS-6.9配置apache服务(3)---虚拟主机配置一 定义二 系统环境三 基于域…...

百度富文本UE的问题集合
百度富文本编辑能上传视频成功但是在浏览器不能播放、显示的问题百度富文本视频封面空白问题百度富文本编辑器UMEditor 添加视频无法删除百度富文本编辑器结果存数据库取出来到js赋值报错怎么让浏览器重新加载修改过的JS文件,而不是沿用缓存里的百度富文本编辑能上传…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...