面向对象的基本概念和方法
面向对象的开发方法在近几十年见得以广泛应用,我们常见的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文件,而不是沿用缓存里的百度富文本编辑能上传…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
