当前位置: 首页 > news >正文

面向对象程序设计

OOP

【面向对象程序设计】(OOP)与【面向过程程序设计】在思维方式上存在着很大的差别。【面向过程程序设计】中,算法是第一位的,数据结构是第二位的,这就明确地表述了程序员的工作方式。首先要确定如何操作数据,然后再决定如何组织数据,以便于数据操作。而【面向对象程序设计】却调换了这个次序,【面向对象程序设计】将数据放在第一位,然后再考虑操作数据的算法。

对于一些规模较小的问题,将问题分解为过程的开发方式比较理想。而面向对象更加适用于解决规模较大的问题。

面向对象程序设计是一种编程范式或编程风格。面向对象的程序是由类和对象组成的(以类和对象作为组织代码的基本单元),并将封装、抽象、继承、多态这四个特性,作为程序设计和实现的基础。

面向对象程序设计语言是【支持类和对象的语法机制。并有现成的语法机制,能方便地实现 OOP 的四大特性(封装、抽象、继承、多态)】的编程语言。

OOP 的四大特性

对于 OOP 的四大特性,我们需要知道每一个特性的如下知识:

  • xxx 特性的含义
  • 为了实现 xxx 特性,需要程序设计语言提供一定的语法机制来支持。对于这四大特性,尽管大部分面向对象程序设计语言都提供了相应的语法机制来支持,但不同的编程语言实现这四大特性的语法机制可能会有所不同。
  • xxx 特性存在的意义、好处

封装

封装(encapsulation)也被称为数据隐藏、数据访问保护。从形式上看,封装就是将数据和行为组合在一起中,并对对象的使用者隐藏数据的实现方式。

对象中的数据被称为实例域(instance field),操作数据的过程被称为方法(method)。对于每个特定的类实例(对象)都有一组特定的实例域值。这些值的集合就是这个对象的当前状态(state)。

实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域。程序仅通过对象的方法与对象数据进行交互。封装给对象赋予了 “黑盒” 特征,这是提高重用性和可靠性的关键。这意味着一个类可以全面地改变存储数据的方式,只要仍旧使用同样的方法操作数据,其他对象就不会知道或介意所发生的变化。


为了实现封装这个特性,需要程序设计语言提供一定的语法机制来支持。这个语法机制就是访问权限控制(访问修饰符:public、protected、private、default)。

在 Java 中,封装就意味着所有的实例域都带有 private 访问修饰符(私有的实例域),并提供带有 public 访问修饰符的域访问器方法和域更改器方法(公共的操作方法)。

如果实例域带有 public 访问修饰符,这就破坏了封装性。因为 public 实例域允许程序中的任何方法对其进行读取和修改。

如果域访问器方法、域更改器方法直接返回了一个可变对象的引用,这就破坏了封装性。在 Employee 类中就违反了这个设计原则,其中的 getHireDay() 方法返回了一个 Date 类对象。Date 类有一个更改器方法 setTime(),可以使用 setTime() 这个方法设置毫秒数。Date 对象是可变的,这一点就破坏了封装性。对 d 调用更改器方法就可以自动地改变这个雇员对象的私有状态。

如果域访问器方法、域更改器方法需要返回一个可变对象的引用,应该首先对对象进行克隆(clone)。

对象 clone 指的是:存放在另一个位置上的对象副本。

class Employee {private Date hireDay;public Date getHireDay() {return hireDay; // Bad}// ...
}Employee harry = . .
Date d = harry.getHireDay();
double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000;
d.setTime(d.getTime() - (long) tenYearsInMilliSeconds);
// let's give Harry ten years of added seniority// 修改后的代码
class Employee {public Date getHireDay() {return (Date) hireDay.clone(); // Ok}// ...
}

封装存在的意义、封装的好处:程序仅通过对象的方法与对象数据进行交互

  • 保护对象数据不被随意修改。
  • 可以改变类的内部实现,除了该类的方法之外,不会影响其他的代码。
  • 更改器方法可以执行错误检查,而直接对实例域进行赋值将不会进行这些处理。例如,setSalary 方法可以检查薪水是否小于 0。

抽象

封装主要讲的是如何隐藏数据、数据访问保护,而抽象讲的是如何隐藏方法的具体实现,让方法的调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。


我们可以借助程序设计语言提供的接口类(比如 Java 中的 interface 关键字语法)或者抽象类(比如 Java 中的 abstract 关键字语法)这两种语法机制,来实现抽象这一特性。

实际上,抽象这个特性是非常容易实现的,并不需要非得依靠接口类或者抽象类这些语法机制来支持。换句话说,并不是说一定要为实现类抽象出接口类,才叫作抽象。即便不编写接口类,单纯的实现类本身就满足抽象特性。

之所以这么说,那是因为类的方法是通过程序设计语言中的 “函数” 这一语法机制实现的。通过函数包裹具体的实现逻辑,这本身就是一种抽象。调用者在调用函数的时候,并不需要去研究函数内部的实现逻辑,只需要通过函数的命名、注释或者文档,了解该函数提供了什么功能,就可以直接调用了。比如,我们在使用 C 语言的 malloc() 函数的时候,并不需要了解它的底层代码是怎么实现的。


抽象存在的意义、抽象的好处:

  • 一方面,抽象提高了代码的可扩展性、可维护性,修改实现不需要改变定义,减少了代码的改动范围;
  • 另一方面,抽象是处理复杂系统的有效手段,抽象能有效地过滤掉不必要关注的信息。

继承

继承(inheritance)即 “is-a” 关系,是一种用于表示特殊与一般关系的。

例如,RushOrder 类由 Order 类继承而来。在具有特殊性的 RushOrder 类中包含了一些用于优先处理的特殊方法,以及一个计算运费的不同方法;而其他的方法,如添加商品、生成账单等都是从 Order 类继承来的。

利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域,以满足新的需求。

从继承关系上来讲,继承可以分为单继承和多继承。有些程序设计语言只支持单继承,不支持多重继承,比如 Java、PHP、C#、Ruby 等,而有些程序设计语言既支持单继承,也支持多继承,比如 C++、Python、Perl 等。

  • 单继承表示一个子类只能继承一个父类;
  • 多继承表示一个子类可以继承多个父类。

为了实现继承这个特性,需要程序设计语言提供一定的语法机制来支持。比如 Java 使用 extends 关键字来实现继承,C++ 使用冒号来实现继承(class B : public A),Python 使用 parentheses() 来实现继承,Ruby 使用 < 来实现继承。


继承存在的意义、继承的好处:继承的一个最大好处就是代码复用。假如两个类有一些相同的属性和方法,我们就可以将这些相同的部分,抽取到基类中,让两个子类继承基类。这样,两个子类就可以重用基类中的代码,避免代码重复写多遍。

不过,代码复用这个好处也并不是继承所独有的,我们也可以通过其他的方式来解决代码复用的问题,比如利用组合关系。

过度的使用继承,继承的层次过深、过复杂,就会导致代码的可读性、可维护性变差。

  • 可读性变差的原因:为了了解一个类的功能,我们不仅需要查看这个类的代码,还需要按照继承关系一层一层地往上查看“父类、父类的父类……”的代码。
  • 可维护性变差的原因:子类和父类高度耦合,修改父类的代码,会直接影响到子类。

多态

一个对象变量可以指向多种实际类型的现象被称为多态(polymorphism)。在运行时自动地选择调用哪个方法的现象被称为动态绑定(dynamic binding)。


为了实现多态这个特性,需要程序设计语言提供一定的语法机制来支持。

  • 第一个语法机制是:程序设计语言要支持继承;
  • 第二个语法机制是:程序设计语言要支持父类的对象变量可以引用子类对象;
  • 第三个语法机制是:程序设计语言要支持方法的重写(override)。

在 Java 程序设计语言中,对象变量是多态的。一个父类的对象变量既可以引用一个父类的对象,也可以引用一个子类的对象。

一个 Employee 变量既可以引用一个 Employee 类的对象,也可以引用一个 Employee 类的任何一个子类的对象(例如, Manager、Executive、 Secretary 等)。

对于多态特性的实现方式,除了利用 “继承加方法重写” 这种实现方式之外,还有其他两种比较常见的的实现方式,一种是利用接口类语法,另一种是利用 duck-typing 语法。不过,并不是每种程序设计语言都支持接口类或者 duck-typing 这两种语法机制,比如 C++ 就不支持接口类语法,而 duck-typing 只有一些动态语言才支持,比如 Python、JavaScript 等。

  • 接口类语法:一个对象变量(接口类)可以指向多种实际类型(实现类)
  • duck-typing 语法:duck-typing 可以这样表述:“如果看起来像鸭子,叫起来像鸭子,那么它一定是鸭子”。

多态存在的意义、多态的好处:

  • 多态的好处是,我们可以在一个比较稳定的、抽象的层面上编程,而不被更加具体的、易变的实现细节干扰。
  • 多态也是很多设计模式、设计原则、编程技巧的代码实现基础,比如策略模式、基于接口而非实现编程、依赖倒置原则、里式替换原则、利用多态去掉冗长的 if-else 语句等。

参考资料

《Java核心技术卷一:基础知识》(第10版)

04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?-极客时间 (geekbang.org)

05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题? (geekbang.org)

相关文章:

面向对象程序设计

OOP 【面向对象程序设计】&#xff08;OOP&#xff09;与【面向过程程序设计】在思维方式上存在着很大的差别。【面向过程程序设计】中&#xff0c;算法是第一位的&#xff0c;数据结构是第二位的&#xff0c;这就明确地表述了程序员的工作方式。首先要确定如何操作数据&#…...

Linux 用户身份切换(su,sudo)

文章目录 Linux 用户身份切换su使用案例 sudo使用案例 visudo与/etc/sudoers单一用户可使用root所有命令&#xff0c;与sudoers文件语法利用wheel用户组以免密码的功能处理visudo有限制的命令操作通过别名创建visudosudo的时间间隔问题sudo搭配su的使用方式 Linux 用户身份切换…...

求倒置数问题

文章目录 求倒置数程序设计程序分析求倒置数 【问题描述】数组A【0,…,n-1】是一个n个不同整数数构成的数组。如果i<j,但是A[i]〉A[j],则这对元素(A[i],A[j])被称为一个倒置(inversion)。设计一个O(nlogn)算法来计算数组中的倒置数量 【输入形式】输入两行,第一行…...

sed(学习)

1、清除环境变量 ​​​​​​profile~/.bash_profile sed -i s#export LD_LIBRARY_PATH.*##g $profile 2、设置环境变量(替换值) sed -i s#export LD_LIBRARY_PATH.*#export LD_LIBRARY_PATH/opt/testlinux/lib#g ~/.bash_profile 3、修改配置文件 sdk_dir/root/test log_dir/…...

B - GCD Subtraction

文章目录 AtCoder Regular Contest 159B - GCD Subtraction AtCoder Regular Contest 159 B - GCD Subtraction 问题&#xff1a;每次A,B都减去gcd(A,B)&#xff0c;求其中一个减到0至少需要多少次主要思路&#xff1a; 首先第一步应该想到每次减去的数&#xff0c;先减去的数…...

解决Failed to load ApplicationContext问题的思路

中文翻译&#xff1a; 加载ApplicationContext失败 第一步&#xff1a;首先检查测试类的注解 以及 依赖 SpringBootTest <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scop…...

基于CAMX大气臭氧来源解析模拟与臭氧成因分析实践技术应用

查看原文>>>基于CAMX大气臭氧来源解析模拟与臭氧成因分析实践技术应用 目录 专题一、大气臭氧污染来源及成因分析技术讲解&#xff1b;CAMx模式初识及臭氧来源解析模拟本地案例配置说明 专题二、CAMx模式编译安装及空气质量模拟案例配置 专题三、CAMx扩展和探测工…...

异常的讲解 (1)

目录 异常入门的案例 异常介绍 基本概念 异常的小结 常见的运行时异常 1.NullPointerException空指针异常 2.ArithmeticException数学运算异常 3.ArraylndexOutOfBoundsException数组下标越界异常 4.ClassCastException类型转换异常 5.NumberFormatException数字格式不…...

Prometheus - Grafana 监控 MySQLD Linux服务器 demo版

目录 首先是下载Prometheus 下载和安装 配置Prometheus 查看监控数据 监控mysql demo 部署 mysqld_exporter 组件 配置 Prometheus 获取监控数据 -------------------------------------- 安装和使用Grafana 启动Grafana -------------------------------------- 配…...

应届生,实力已超6年,太卷了!

你好&#xff0c;我是田哥 今晚上&#xff0c;给一位朋友做模拟面试&#xff0c;原本说好的90分钟左右&#xff0c;结果整了2个多小时。 很多人估计也很好奇&#xff0c;我们这两个多小时聊聊什么&#xff0c;下面我给大致总结一下&#xff1a; 面试技巧 面试中&#xff0c;我们…...

0-1背包问题

文章目录 0-1背包问题JavaPython0-1背包问题 【问题描述】 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 【输入形式】 第一行输入物品的个数n和背包容量C。 第二行输入每个物品的价值v[i…...

VUE前端项目环境搭建

背景&#xff1a; 想要使用vue搭建一个前端项目&#xff0c;写个小网站练练手&#xff0c;因为没有前端经验&#xff0c;所以从网上找了一个vue得开源模板使用&#xff0c;经过一番挑选选中了字节公司花裤衩大佬开源得项目&#xff0c;地址如下&#xff1a; 开源项目地址&…...

VMware安装Win2000安装程序闪退重启等问题的解决方法

VMware安装Win2000安装程序闪退重启等问题的解决方法 【症状】 1、比较新的VMware版本如16.2.5&#xff0c;Win2000安装时&#xff0c;安装程序在安装Distributed Transaction Coordinator时闪退重启 2、比较新的VMware版本如17.0.1&#xff0c;还会发生显示跳跃性卡顿的现象…...

【id:45】【20分】A. Equation(类与对象+构造)

题目描述 建立一个类Equation&#xff0c;表达方程ax2bxc0。类中至少包含以下方法&#xff1a; 1、无参构造&#xff08;abc默认值为1.0、1.0、0&#xff09;与有参构造函数&#xff0c;用于初始化a、b、c的值&#xff1b; 2、set方法&#xff0c;用于修改a、b、c的值 3、ge…...

数据库事务

什么是事务 在数据库中&#xff0c;事务&#xff08;Transaction&#xff09;是指一组数据库操作&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;是保证数据库操作一致性的基本单位。事务具有原子性&#xff08;Atomicity&#xff09;、一致性…...

Macbook(苹果电脑) VSCode 创建简单c++程序 配置C++开发环境

1.打开 Terminal 终端&#xff08;Command空格&#xff0c;输入Terminal&#xff09;。 1.1 输入如下指令&#xff0c;查看是否显示版本信息。 clang --version 1.2 如果出现版本信息&#xff0c;则跳过&#xff0c;否则输入 xcode-select --install 2. 为 VS Code 安装插件 …...

如何使用 Matlab 构建深度学习模型

深度学习已经成为了AI领域的热门话题&#xff0c;相信很多人都想学习如何构建深度学习模型&#xff0c;那么&#xff0c;我们就一起来看看如何使用Matlab构建深度学习模型。 首先&#xff0c;我们需要准备好Matlab的环境。Matlab是一款非常强大的数学计算软件&#xff0c;它提…...

PDF怎么转CAD文件?(免费!高效转换方法汇总)

一般而言&#xff0c;PDF图纸是不能修改的。若需修改&#xff0c;则需将PDF转CAD&#xff0c;此时如何满足PDF转CAD的需求呢&#xff1f;今天&#xff0c;我将教你两种免费的PDF转CAD的方法&#xff0c;助力高效办公。 1.本地软件转换法 这是用本地软件转换方法&#xff0c;支…...

经历了野蛮生长之后,新科技或许已经抵达了全新的临界点

跳出仅仅只是以概念和营销的方式来定义元宇宙&#xff0c;真正找到元宇宙与现实商业之间的桥接&#xff0c;让元宇宙可以在真实实践上得到复现&#xff0c;才是保证元宇宙的发展可以进入到一个全新发展阶段的关键所在。归根到底&#xff0c;我们还是要找到元宇宙落地的正确的方…...

Segment Anything论文翻译,SAM模型,SAM论文,SAM论文翻译;一个用于图像分割的新任务、模型和数据集;SA-1B数据集

【论文翻译】- Segment Anything / Model / SAM论文 论文链接&#xff1a; https://arxiv.org/pdf/2304.02643.pdfhttps://ai.facebook.com/research/publications/segment-anything/ 代码连接&#xff1a;https://github.com/facebookresearch/segment-anything 论文翻译&…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...