我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入浅析java中的面向对象

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入浅析java中的面向对象

本篇文章给大家分享的是有关深入浅析java中的面向对象,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一.面向对象(OO)

面向对象(OO):就是基于对象概念,以对象为中心,以类和继承为构造机制,充分利用接口和多态提供灵活性,来认识、理解、刻划客观世界和设计、构建相应的软件系统。面向对象的特征:虽然各种面向对象编程语言相互有别,但都能看到它们对面向对象基本特征的支持,

即 “抽象、封装、继承、多态” :

– 抽象,先不考虑细节
– 封装,隐藏内部实现
– 继承,复用现有代码
– 多态,改写对象行为

面向对象设计模式:是“好的面向对象设计”,所谓“好的面向对象设计”是那些可以满足“应对变化,提高复用”的设计。面向对象设计模式描述的是软件设计,因此它是独立于编程 语言的,但是面向对象设计模式的最终实现仍然要使用面向对象编程语言来表达。面向对象设计模式不像算法技巧,可以照搬照用,它是建立在对“面向对象”纯 熟、深入的理解的基础上的经验性认识。

上边就见大的描述一下面向对象和设计模式的概念和关系。我们进行设计的时候,就是充 分的理解和利用OO的四个基本的特征来展开设计,所以大家必须在进行设计前,要熟悉和掌握面向对象的技术,在这就不详细介绍了,而对于设计模式是给我们提供了设计时的参考模型,而掌握面向对象设计模式的前提是首先掌握“面向对象”技术。

二.OO(面向对象)的设计目标

※可扩展性Extensibility:有了新的需求,新的性能可以容易添加到系统中,不影响现有的性能,也不会带来新的缺陷。

※可修改性Flexibility:系统一部分的代码要修改时不会破坏系统的现有结构,也不会影响到其它的部分。

※可替换性Pluggability:可以将系统中的某些代码替换为相同接口的其它类,不会影响到系统。

三.OO设计的5大原则及其之间的关系

3.1 OO设计原则的总结

※单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。单一是一个类的优良设计。交杂不清的职责将使得代码看起来特别别扭牵一发而动全身,有失美感和必然导致丑陋的系统错误风险。

※开放封闭原则:是说软件实体(类、模块、函数等等)应该可以扩展但不可修改。实现开开放封闭原则的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以修改就是封闭的;而通过面向对象的继承和多态机制,又可以实现对抽象类的继承,通过覆写其方法来改变固有行为,实现新的拓展方法,所以就是开放的。“需求总是变化”没有不变的软件,所以就需要用封闭开放原则来封闭变化满足需求,同时还能保持软件内部的封装体系稳定,不被需求的变化影响。

※依赖倒置原则:依赖抽象,不要依赖具体。抽 象的稳定性决定了系统的稳定性,因为抽象是不变的,依赖于抽象是面向对象设计的精髓,也是依赖倒置原则的核心。依赖于抽象是一个通用的原则,而某些时候依 赖于细节则是在所难免的,必须权衡在抽象和具体之间的取舍,方法不是一层不变的。依赖于抽象,就是对接口编程,不要对实现编程。

※里氏代换原则:子类型必须能够替换到他们的父类型。Liskov 替换原则,主要着眼于对抽象和多态建立在继承的基础上,因此只有遵循了Liskov替换原则,才能保证继承复用是可靠地。实现的方法是面向接口编程:将公 共部分抽象为基类接口或抽象类,通过ExtractAbstractClass,在子类中通过覆写父类的方法实现新的方式支持同样的职责。Liskov替 换原则能够保证系统具有良好的拓展性,同时实现基于多态的抽象机制,能够减少代码冗余,避免运行期的类型判别。

※接口隔离原则: 多个和客户相关的接口要好于一个通用接口。分离的手段主要有以下两种:1、委托分离,通过增加一个新的类型来委托客户的请求,隔离客户和接口的直接依赖,但是会增加系统的开销。2、多重继承分离,通过接口多继承来实现客户的需求,这种方式是较好的。

下边是前面没有提到过的两个原则,也是设计时要考虑的重要原则。

※迪米特法则:不相互直接通信的类之间,不要直接发生相互作用。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果一个类需要调用领一个类的某个方法话,可以通过第三者转发这个调用。迪米特法则首先强调的前提是在类的设计上,每一类都应当尽量降低成员的访问权限。它的根本思想是强调类之间的松耦合。

 ※合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用继承。合 成(Composition)和聚合(Aggregation)都是关联的特殊种类,聚合表示一种弱的拥有关系;合成这是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。优先使用合成或聚合原则将有助于保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规 模,并且不太可能增长为不可控制的庞然大物

3.2 OO设计原则之间的关系

实现“开-闭”原则(OCP)的关键步骤是抽象化。基类与子类之间的继承关系就是抽象化的体现。因此里氏代换原则是对实现抽象化的具体步骤的规范。违反里氏代换原则意味着违反了“开-闭”原则,反之未必。

“开-闭”原则与依赖倒转原则(DIP)是目标和手段的关系。如果说开闭原则是目标,依赖倒转原则是到达"开闭"原则的手段。如果要达到最好的"开闭"原则,就要尽量的遵守依赖倒转原则,依赖倒转原则是对"抽象化"的最好规范。

里氏代换原则(LSP)是依赖倒转原则的基础,依赖倒转原则是里氏代换原则的重要补充。

接口分离原则(ISP)也是确保“开-闭”原则的一个重要手段。

对于单一职责原则(SRP),个人认为尽量做到为好,职责越单一,“开-闭”和里氏代换越容易实现。

四.OO设计原则和目标的关系

1.可扩展性Extensibility :允许一个具有同样接口的新类替代旧类,是对抽象接口的复用。客户端依赖于抽象接口,而不是一个具体实现类,使得这个具体类可以被别的具体类替换,而不影响客户端。以下原则实现可扩展性。

※开/闭原则
※里氏替换原则
※依赖倒转原则
※合成/聚合复用原则

2.可修改性Flexibility:模块相对独立,通信尽可能少。这样当一个模块修改时,对别的模块的影响很小。

以下原则实现可修改性。

※开/闭原则
※迪米特法则
※接口隔离原则

3、可替换性Pluggability:当一部分不再满足需要时,可以将旧的部分拔出,新的部分插入。

以下原则实现可替换性。

※开/闭原则
※里氏代换原则
※依赖倒转原则
※合成/聚合复用原则

五.OO(面向对象)的设计过程

1. 分析式样,进行机能分类。

2. 根据机能进行类的抽象。

※ 类的抽象 - 在这里步里,我们可以根据 “单一职责原则”,进行类的具体抽象。尽量做到,类的功能单一和清晰化。

※ 封装变化点– 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。

3. 设计抽象基类和接口类。

※ 在进行基本的基类的抽象和接口定义时,要遵照“接口分离原则”进行接口的抽象。

※ 在设计接口和基类时,不要总是关注细节,要记住针对接口编程,而不是针对实现编程。

※ 对于抽象的基类和派生类之间要做到“里氏替换原则”的要求。

4.确定类间的耦合关系。

4.1 决定耦合的程度的依据何在呢?

※ 简单的说,就是根据需求的稳定性,来决定耦合的程度。

※ 对于稳定性高的需求,不容易发生变化的需求,我们完全可以把各类设计成紧耦合的,因为这样可以提高效率,而且我们还可以使用一些更好的技术来提高效率或简化代码。

※ 如果需求极有可能变化,我们就需要充分的考虑类之间的耦合问题,我们可以想出各种各样的办法来降低耦合程度,但是归纳起来,不外乎增加抽象的层次来隔离不同的类,这个抽象层次可以是抽象的类、具体的类,也可以是接口,或是一组的类。我们可以用一句话来概括降低耦合度的思想:"针对接 口编程,而不是针对实现编程。

※ 在决定类的耦合关系时,尽量考虑“迪米特法则”和“合成/聚合复用原则”。

4.2 怎样做到依赖倒转?

※ 以抽象方式耦合是依赖倒转原则的关键。抽象耦合关系总要涉及具体类从抽象类继承,并且需要保证在任何引用到基类的地方都可以改换成其子类,因此,里氏代换原则是依赖倒转原则的基础。

※ 依赖于抽象:建议不依赖于具体类,即程序中所有的依赖关系都应该终止于抽象类或者接口。尽量做到:

(1)任何变量都不应该持有一个指向具体类的指针或者引用。
 (2)任何类都不应该从具体类派生。
 (3)任何方法都不应该覆写它的任何基类中的已经实现的方法。

5.运用OO设计的5大原则来对设计进行进一步的优化

※ 对于类的抽象和职能,是否满足“单一职责原则”
※ 对于继承关系和引用基类的地方,是否满足“里氏代换原则”和“依赖倒置原则”
※ 对于接口和基类,是否“接口隔离原则”
※ 总体上是否满足“开-闭原则”

总体上说,在面向对象设计时,要充分考虑设计的5大原则,但不是强求的,一味的追求满足原则也可能会导致设计出的系统在性能和资源上的消耗,可以根据具体的情况来具体的分析和设计。

以上就是深入浅析java中的面向对象,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入浅析java中的面向对象

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入浅析java中的面向对象

本篇文章给大家分享的是有关深入浅析java中的面向对象,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一.面向对象(OO)面向对象(OO):就是基于对象概念,以对象为中心,以类和
2023-05-31

深入浅析Kotlin中的面向对象编程

这篇文章给大家介绍深入浅析Kotlin中的面向对象编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Kotlin 面向对象可以看到Kotlin中的类还是很普通的,大多与Java相似,比较特殊的有:每一个构造函数都必须为
2023-05-31

深入浅析java中面向对象的继承和多态

深入浅析java中面向对象的继承和多态?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。继承和多态一.this super关键字1.this: 可以在构造器中的第一代码中调用本
2023-05-31

深入浅析Java中的对象流

这期内容当中小编将会给大家带来有关深入浅析Java中的对象流,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java中可以通过对象流将一个序列化的对象保存到硬盘中,或者硬盘中读取一个对象。对象流的存储和读取
2023-05-31

深入浅析Java中对象的深复制与浅复制

本篇文章为大家展示了深入浅析Java中对象的深复制与浅复制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 Java对象深复制与浅复制实例详解我们在遇到一些业务场景的时候经常需要对对象进行复制,对于对
2023-05-31

深入浅析Java中的对象与引用

今天就跟大家聊聊有关深入浅析Java中的对象与引用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java中的对象和引用详解 在Java中,有一组名词经常一起出现,它们就是“对象和对象
2023-05-31

深入浅析java虚拟机中的对象访问

今天就跟大家聊聊有关深入浅析java虚拟机中的对象访问,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。java 虚拟机中对象访问详解对象访问会涉及到Java栈、Java堆、方法区这三个
2023-05-31

深入浅析Java中变量与对象的作用域

深入浅析Java中变量与对象的作用域?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。大多数程序设计语言都提供了“作用域”(Scope)的概念。对于在作用域里定义的名字,作用域同时
2023-05-31

Java 类与对象:对象导向编程的基石(深入分析)

: 对象导向编程(OOP)的关键概念之一是类和对象。了解类和对象的用法对于理解和编写高质量的 Java 代码至关重要。本文将深入探讨 Java 中的类和对象,包括其定义、创建和使用方法。
Java 类与对象:对象导向编程的基石(深入分析)
2024-03-09

PHP 类与对象:深入浅出,从零开始学习面向对象编程

面向对象编程是一种编程范式,它将数据和操作数据的方法封装成对象,通过对象发送消息来实现操作数据的目的。PHP 是面向对象编程语言,它提供了一套丰富的类和对象库,使得开发人员可以轻松地构建出复杂而强大的程序。
PHP 类与对象:深入浅出,从零开始学习面向对象编程
2024-02-25

C++的面向对象编程:深入解析与理解

本文将从基本概念到实际应用,为您详细解析C++中的面向对象编程。

浅析面向过程、面向对象和面向协议编程

本文简单分析面向过程,面向对象,面向协议三种编程方式。前面两种方式很多人都讲过,这里不再重复讲,更多地介绍面向协议编程。

深入浅析Java中的 FilterInputStream

这期内容当中小编将会给大家带来有关深入浅析Java中的 FilterInputStream,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。FilterInputStream 介绍FilterInputStr
2023-05-31

深入浅析Java 中的LockSupport

这期内容当中小编将会给大家带来有关深入浅析Java 中的LockSupport,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。LockSupport介绍LockSupport是用来创建锁和其他同步类的基本线
2023-05-31

深入浅析Java 中的CharArrayReader

深入浅析Java 中的CharArrayReader?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CharArrayReader 介绍CharArrayRead
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录