面向对象程序设计概述

news2025/1/9 16:20:47

🧑‍💻CSDN主页:夏志121的主页

📋专栏地址:Java核心技术专栏

目录

一、类

二、对象

三、识别类

四、类之间的关系


        面向对象程序设计(Object-Oriented Programming,OOP)是当今的主流程序设计范型,它取代了20世纪70年代的“结构化”或过程式编程技术。由于Java是面向对象的,所以必须熟悉OOP才能够很好地使用Java。

        面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能和隐藏的实现。程序中的很多对象是来自标准类库的“成品”,还有一些是自定义的。究竟是自己构造对象,还是从外界购买,这完全取决于开发项目的预算和时间。但是,从根本上说,只要对象能够满足要求,就不必关心其功能到底是如何实现的。

一、类

        类(class)指定了如何构造对象。可以将类想象成制作小甜品的模具,将对象想象为小甜饼。由一个类构造(construct)对象的过程称为这个类的实例(instance)

        标准Java库中提供了几千个类,可用于各种目的,如用户界面设计、日期和日历,以及网络编程。还有自行创建的类,来描述需求应哟相应问题领域中的对象。

        封装(encapsulation,有时称为信息隐藏)是处理对象的一个重要概念。从字面意思看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现细节。

        实现封装的关键在于,绝不能让其他类中的方法直接访问这个类的实例字段。程序只能通过对象的方法与对象数据进行交互。封装为对象赋予了"黑盒"特性,这有利于提高重用性和可靠性。

        OOP的另一个原则会让用户自定义Java类变得更为容易,就是可以通过扩展其他类来构建新类。Java提供类一个“超类”,名为Object,所有其他类都扩展至Object

        扩展一个已有的类时,这个新类具有被扩展的那个类的全部属性和方法,只需要在新类中提供适用于这个新类的新方法和实例字段。通过扩展一个类来得到另外一个类的概念称之为继承(inheritance)

二、对象

使用OOP,一定要清楚对象的三个主要特性:

对象的行为(behavior)—— 可以对这个对象做哪些操作,或者可以对这个对象应用哪些方法?

对象的状态(state)—— 调用那些方法时,对象会如何响应?

对象的标识(identity)—— 如何区分可能有相同行为和状态的不同对象?

        同一个类的所有示例对象都有一种家族相似性,它们都支持相同的行为。一个对象的行为由所调用的方法来定义。

        每个对象都会保存着描述当前状态的信息,这就是对象的状态。对象状态的改变必然是调用方法的结果(如果不经过方法的调用就可以改变对象状态,这说明破坏了封装性)。

        对象的状态并不能完全描述一个对象,因为每个对象都有一个唯一的标识(identity,或称身份)。需要注意,作为同一个类的实例,每个对象的标识总是不同的,状态通常有所不同。

        对象的这个关键特性会彼此相互影响。例如,对象的状态会影响它的行为(如果一各订单"已发货"或"已付款",就应该拒绝要求增删商品的方法调用。反过来,如果订单是“空的”,即还没有订购任何商品,就不应该允许"发货")。

三、识别类

        传统的过程式程序中,必须从最上面的main函数开始编写程序。设计一个面向对象系统时,则没有所谓的“最上面”。因此,学习OOP的初学者常常会感觉无从下手。答案是:先从识别类开始,然后再为各个类添加方法

        识别类的一个简单经验是在分析问题的过程中寻找名词,而方法对应动词

        例如,在订单处理系统中,有这样一些名词:

● 商品(Item);

● 订单(Order);

● 发货地址(Shipping address);

● 付款(Payment);

● 账户(Account)。

从这些名词就可以得到类Item、Order等。

        接下来查找动词。商品要添加(add)到订单中,订单可以发货(ship)取消(cancel),另外可以对订单完成付款(apply)。对于每一个动词,如“添加”“发货”“取消”或者“完成付款”,要识别出负责完成相应动作的对象。例如,当一个新商品添加到订单中时,订单对象就是负责的对象,因为它知道如何存储商品以及如何对商品进行排序,也就是说,add应该是Order类的一个方法,它接收一个Item对象作为参数。

四、类之间的关系

类之间最常见的关系有

● 依赖(“uses-a”);

● 聚合(“has-a”);

● 继承(“is-a”)。

        依赖(dependence),即“uses-a”关系,是一种最明显的也最一般的关系。例如,Order类使用了Account类,因为Order对象需要访问Account对象来查看信用状态。但是Item类不依赖于Account类,因为Item对象不需要考虑客户账户。因此,如果一个类的方法要使用或操作另一个类的对象,我们就说前一个类依赖于后一个类。

        应当尽可能减少相互依赖的类。这里的关键是,如果类A不知道B的存在,它就不会关心B的任何改变(这意味着B的改变不会在A中引入bug)。用软件工程的术语来说,就是要尽可能减少类之间的耦合(coupling)

        聚合(aggregation),即“has-a”关系,很容易理解,因为这种关系很具体。例如,一个Order对象包含一些Item对象。包含关系意味着类A的对象包含类B的对象。

        继承(inheritance),即“is-a”关系,表示一个更特殊的类与一个更一般的类之间的关系。例如,Rushorder类继承了Order类。在特殊化的RushOrder类中包含一些用于优先处理的特殊方法,还提供了一个计算运费的不同方法;而其他的方法,如添加商品、生成账单等都是从Order类继承来的。一般而言,如果类D扩展了类C,类D会继承类C的方法,另外还会有一些额外的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线段树详解

目录 线段树的概念 线段树的实现 线段树的存储 需要4n大小的数组 线段树的区间是确定的 线段树的难点在于lazy操作 代码样例 线段树的概念 线段树(Segment Tree)是一种平衡二叉树,用于解决区间查询问题。它将一个区间划分成若干个子区…

Android 车载值不值得入手学?

前言 随着智能车的不断普及和智能化程度的提高,车载系统也在逐步升级和演进,越来越多的汽车厂商开始推出采用Android系统的车载设备,这为Android车载开发提供了广泛的市场需求。 其次,随着人工智能技术的发展和应用,…

Linux : 安装源码包

安装源码包之前我们要准备好yum环境,或者使用默认上网下载的yum仓库或者查看:Linux:rpm查询安装 && yum安装_鲍海超的博客-CSDN博客 准备离线yum仓库 ,默认的需要在有网环境下才能去网上下载 其次就是安装 gcc make 准…

UDP协议 sendto 和 recvfrom 浅析与示例

UDP(user datagram protocol)用户数据报协议,属于传输层。 UDP是面向非连接的协议,它不与对方建立连接,而是直接把数据报发给对方。UDP无需建立类如三次握手的连接,使得通信效率很高。因此UDP适用于一次传…

Kyligence Zen 一站式指标平台体验——“绝对实力”的指标分析和管理工具——入门体验评测

🦖欢迎观阅本本篇文章,我是Sam9029 文章目录 前言Kyligence Zen 是什么Kyligence Zen 能做什么Kyligence Zen 优势在何处 正文注册账号平台功能模块介绍指标图表新建指标指标模板 目标仪表盘数据设置 实际业务体验---使用官网数据范例使用流程归因分析指…

MySQL --- 多表设计

关于单表的操作(包括单表的设计、单表的增删改查操作)我们就已经学习完了。接下来我们就要来学习多表的操作,首先来学习多表的设计。 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构…

ChatGPT-4怎么对接-ChatGPT-4强化升级了哪些功能

ChatGPT-4怎么使用 使用ChatGPT-4,需要通过OpenAI的API接口来对接ChatGPT-4。OpenAI是一个人工智能公司,为开发者提供多个API接口,包括自然语言处理,图像处理等。ChatGPT-4是OpenAI开发的最新版本的聊天式对话模型,可…

React antd Form item「受控组件与非受控组件」子组件 defaultValue 不生效等问题总结

一、为什么 Form.Item 下的子组件 defaultValue 不生效? 当你为 Form.Item 设置 name 属性后,子组件会转为受控模式。因而 defaultValue 不会生效。你需要在 Form 上通过 initialValues 设置默认值。name 字段名,支持数组 类型:N…

2.存储器层次系统

存储器 随机访问存储器 RAM(随机存储器) SRAM 双稳态触发器,有电就保持不变,干扰消除后时会恢复到稳定值,晶体管多因此密集度低 DRAM 每个位存储为对一个电容的充电,对干扰敏感,漏电所以需要刷…

静态数码管

静态数码管 1、简介工作方式数码管静态显示原理 2、硬件设计3、软件设计4、 1、简介 一般共阳极数码管更为常用 好处:将驱动数码管的工作交到公共端(一般接驱动电源),加大驱动电源的功率自然要比加大IC芯片I/O口的驱动电流简单许…

【python 生成器】零基础也能轻松掌握的学习路线与参考资料

一、学习路线 了解生成器的概念和作用 首先,需要明确生成器的概念和作用,生成器是一种特殊的迭代器,它可以在循环中逐个地产生值,而不是一次性将所有的值产生出来。它的作用是使程序更加高效,达到节省内存等的效果。…

Linux 入门

文章目录 一、概述二、安装CentOS下载地址VMware下载地址 三、linux文件与目录结构Linux系统中一切皆文件Linux目录结构 四、VI/VIM 编辑器vi/vim是什么一般模式常用语法键盘图编辑模式指令模式 五、网络配置六、远程登陆七、系统管理Linux 中的进程和服务service 服务管理chkc…

几种常见的电源防反接电路

电源防反接,也即是防止电源的正负极搞反而导致电路损坏,例如你采用的是标准的DC口,那么没什么必要加入此种电路。而如果采用的是非常规的,如自定义的接插件等,那么就很有必要了。 举个例子:小编以前就采用…

企业在线制作帮助中心,选择:语雀、石墨、Baklib哪个好?

在当今互联网时代,越来越多的企业开始将帮助中心建设在线化。在线帮助中心的好处不仅可以提高用户的使用体验,也可以提高企业的工作效率。然而,选择一个合适的在线制作帮助中心工具却并不是一件容易的事情。在众多的在线制作帮助中心工具中&a…

Python3 入门教程||Python3 SMTP发送邮件||Python3 多线程

Python3 SMTP发送邮件 在Python3 中应用的SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 python的 smtplib 提供了一种很方便的途径发送电子邮件。它对…

[cryptoverse CTF 2023] crypto部分

没打,完事作作题. Warmup 1 Decode the following ciphertext: GmvfHt8Kvq16282R6ej3o4A9Pp6MsN. Remember: CyberChef is your friend. Another great cipher decoding tool is Ciphey. 热身一下就凉,问了别人,用ciphey说是能自动解,但是安装报错 rot13base58 这个没有自动的…

JavaCollection集合:概述、体系特点、常用API、遍历方式

一、集合概述 集合和数组都是容器 数组 特点:数组定义完成并启动后,类型确定、长度固定。 劣势:在进行增删数据操作的时候,数组是不太合适的,增删数据都需要放弃原有数组或者移位。 使用场景:当业务数…

JMeter 常用的几种断言方法,你会了吗?

JMeter是一款常用的负载测试工具,通过模拟多线程并发请求来测试系统的负载能力和性能。在进行性能测试时,断言(Assertion)是非常重要的一部分,可以帮助我们验证测试结果的正确性。下面介绍JMeter常用的几种断言方法。 …

MySQL 运算符解析

1.算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加 ()、减(-)、乘(*)、除(/)和取模(%&…

K8S:K8S部署常见错误及解决方法

目录 1、node节点kubelet服务起不来 2、安装cni网络插件时 kubectl get node master和node一直noready①有延时,需要等待10分钟左右,超过15分钟则有问题 3、部署报错kubectl get nodes No resources found 4、k8s部署报错error:kubectl ge…