关于编程中面向对象的理解,什么是面向对象
- 发表于:2019-11-05 15:20
- 阅读(2628)
参考李刚的《Java疯狂讲义》。
关于面向对象的理解
1. 程序中的面向对象
在目前的软件开发领域中有两种主流的开发方法:结构化开发方法和面向对象开发方法。早起啊的编程语言如:C、Basic、Pascal等都是结构化编程语言;随着软件开发技术的逐渐发展,人们发现面向对象的方式可以提供更好的可重用性、可扩展性和可维护性,于是催生了大量的面向对象的编程语言,如C++、Java、C#和Ruby(一个非常厉害的大佬写的)等。
(1) 结构化程序设计
结构化程序设计方法主张按功能来分析系统需求,其主要原则可概括为自顶向下、逐步求精、模块化等(是不是和平时工作当中的设计模式很像呢?)。结构化程序设计首先采用结构化分析(Structured Analysis, SA)方法对系统进行需求分析,然后使用结构化设计(Structured Design, SD)方法对系统进行概要设计、详细设计,最后采用结构化编程(Structured Program, SP)方法来实现系统。使用这种方式可以较好地保证软件系统的开发进度和质量。
由于结构化程序设计方法主张按功能把软件系统逐步细分,因此这种方法也称为面向功能的程序设计方法;结构化程序设计的每个功能都负责对数据进行一次处理,每个功能都接受一些数据,处理完后输出一些数据,这种处理方式也被称为面向数据流的处理方式。(当然不管是结构化程序设计还是面向对象程序设计,目前适合于自己负责的项目的设计就是好设计)
结构化程序设计里的最小的程序单元是函数(不是方法哦),每个函数都负责完成一个功能,用于接收一些输入数据,函数对这些输入数据进行处理,处理完后输出另一些数据。整个软件系统就是由这一个个函数所组成,其中作为程序入口的函数被称为主函数,主函数依次调用其他普通函数,普通函数之间依次调用,从而完成整个软件系统的功能。如下图:
可以看出结构化程序设计采用的是自顶向下的设计方式,在设计阶段就需要考虑好各个模块应该分解成哪些子模块,每个子模块又如何分解成哪些更小的模块等等,直到将模块都细分成一个一个函数。
每个函数都是具有输入、输出的子系统,函数的输入数据包括函数形参、全局变量和常量等,函数的输出数据包括函数返回值以及传出参数等。结构化程序设计方式主要有如下两个局限性:
设计不够直观,与人类的思维习惯不一致。采用结构化程序分析、设计时,开发者需要将客观世界模型分解成一个一个的功能,每个功能用来完成一定的数据处理。
适应性较差,可扩展性不强。由于结构化设计采用自定向下的设计方式,所以当用户的需求发生改变,或需要修改现有的实现方式时,都需要自顶向下地修改模块结构,这种方式的维护成本相当高。(是不是和工作中碰到的似曾相识呢?)
(2) 程序的三种基本结构
任何简单或复杂的算法都可以由三种基本结构组合而成,分别是:顺序结构、选择结构和循环结构。这三种结构被称为程序设计的三种基本结构,也是结构化程序设计必须采用的结构。
顺序结构:顺序结构表示程序中的各个操作都是按照它们在源代码中的排列顺序依次执行的,虽然Java是面向对象的编程语言,但Java的方法类似于结构化程序设计中的函数,因此方法中代码的执行也是顺序结构。
选择结构:选择结构表示程序的处理需要根据某个特定的条件选择其中的一个分支执行。有单选择(if)、双选择(if else)和多选择(if elseif / switch)三种形式。
循环结构:循环结构表示程序反复执行某个或某些操作,直到符合某个结束条件才停止循环。有当型结构(while)(先判断条件,当条件为真时执行循环体)和直到型结构(do while)(先直接执行循环体,执行完在判断条件是否继续执行)。
(3) 面向对象程序设计
面向对象设计相对于结构化程序设计可以说是一种更优秀的程序设计方法。它的基本思想是使用类、对象、继承、封装、消息等基本概念进行程序设计。它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在软件系统构造中尽可能运用人类的自然思维方式,强调直接以现实世界中的事物(即对象)为中心来思考,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的类,作为系统的基本构成单元(而不是用一些与现实世界中的事物无关,并且没有对应关系的过程来构造系统),这使得软件系统的组件可以直接映射到客观世界,并保持客观世界中事物及其相互关系的本来面貌。
采用面向对象方式开发的软件系统,其最小的程序单元是类,这些类可生成系统中的多个对象,而这些对象则直接对应到客观世界中的各种事物。
类定义 = 成员变量 + 成员方法
注意:定义一个类,应该是对应客观世界中的哪一种事物(是一种或者说一类);根据当前业务需要关心这个事物的那些状态,程序就为这些状态定义成员变量;根据当前业务需要关心这个事物的那些行为,程序就为这些行为定义方法。
(4) 面向对象的基本特征
面向对象具有三大基本特征,分别是:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。
封装:将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;
继承:实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;Java不支持多继承;
多态:子类对象可以直接赋给父类变量,但运行时依然表现为子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。
2. Java中的面向对象
Java是纯粹的面向对象程序设计语言,这主要表现为Java完全支持面向对象的三种基本特征:继承、封装和多态。Java语言完全以对象为中心,Java程序的最小程序单位是类,整个Java程序是由一个一个的类组成的。
Java完全支持使用对象、类、集成、封装、消息等基本概念来进行程序设计,允许从现实世界中客观存在的事物(即对象)出发来构造软件系统,在系统构造中极可能运用人类的自然思维方式。实际上,这些优势是所有面向对象编程语言的共同特征。面向对象的方式实际上由OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)三个部分有机组成,其中,OOA和OOD的结构需要使用一种方式来描述并记录,目前业界统一采用UML(统一建模语言)来描述并记录OOA和OOD的结果。关于UML这里就不多做介绍,相信大家在大学的时候都有初步了解过,需要自己后续去好好研究。
(1) 一切都是对象
在Java语言中,除了8个基本数据类型值之外,一切都是对象,而对象就是面向对象程序设计的中心。对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机均等可看作对象,它不仅能够表示具体的事物,还能表示抽象的规则、计划或事件。
对象具有状态,一个对象用数据值来描述它的状态。Java通过对象定义成员变量来描述对象的状态;对象还有操作,这些操作可以改变对象的状态,对象的操作也被称为对象的行为,Java通过为对象定义方法来描述对象的行为。
对象实现了数据和操作的结合,对象把数据和对数据的操作封装成一个有机的整体,因此面向对象提供了更大的编程粒度,对程序员来说,也更容易掌握和使用。
对象是Java程序的核心,所以Java中的对象具有唯一性,每个对象都有一个标识来引用它,如果某个对象失去了标识,这个对象就将变成垃圾,只能等着系统垃圾回收机制来回收它。Java语言不允许直接访问对象,而是通过对象的引用来操作对象。
(2) 类和对象
具有相同或相似性质的一组对象的抽象就是类,类是对一类事物的描述,是抽象的、概念上的定义,对象则是实际存在的该类事物的个体,因此也被称为示例(instance)。
对象的抽象化就是类,类的具体化就是对象,也可以说类的实例是对象。类用来描述一系列对象,类概述每个对象应包括的数据,类概述每个对象的行为特征。因此,可以把类理解成某种概念、定义,它规定了某类对象所共同具有的某些数据和行为特性。
Java语言使用class关键字来定义类,定义类时可使用成员变量来描述该类对象的数据,可使用方法来描述该类对象的行为特征。
在客观世界中有若干类,这些类之间有一定的结构关系。主要有以下两种结构关系:
从一般到特殊的关系:这种关系就是典型的继承关系,Java语言使用extends关键字来表示这种继承关系,Java的子类是一种特殊的父类。可以理解为:父类是大类(一种对事物更加抽象描述的类),子类是小类(一种对事物更加具体描述的类),因此,这种一般 => 特殊的关系其实是一种 “is a” 的关系。
从整体到部分的关系:也被称为组装结构,是典型的组合关系,Java语言通过在一个类里保存另一个对象的引用来实现这种组合关系。因此,这种整体 => 部分结构关系其实是一种 “has a” 关系。
开发者定义Java类之后,就可以使用new关键字类创建指定类的对象了,每个类可以创建任意多个对象,多个对象的成员变量值可以不同-这变现为不同对象的数据存在差异。
关于面向对象的理解就先介绍这么多,以后再补充,如果不对的地方欢迎指出~O(∩_∩)O哈哈~
上一篇:没有了
相关推荐
-
mac安装subversion,并使用svn命令检出服务器上的代码库项目
mac安装svn只要通过Homebrew安装即可,不需要下载额外的安装包手动安装,Homebrew类似一个软件库,我们可以通过brew命令实现一键下载并安装我们所需要的常用软件。
-
Java如何获取泛型类T的Class
我们平时在封装接口或抽象类的时候经常会用到Java的泛型,经常会在传入一个泛型类T,然后封装一些抽象的方法,泛型的好处就是在编译的时候检查类型安全,并且所有的强制类型转换都是隐式和自动的,这样可以提高代码的通用性。但是我们有时候需要获取泛型类的Class,那可以如何获取到呢?
-
springboot项目事务报错:Transaction synchronization is not active
这几天在使用spring声明式事务的时候突然报了一个错误:Transaction synchronization is not active,之前使用的都是好好的,为什么这次就不行了呢?不就是加一个 @Transactional 而已嘛???
-
mysql应该如何在where语句中添加if语句进行条件判断?where if 语句应该如何使用
我们在平时的项目开发中,有时候会遇到复杂一点的需求,需要我们手动编写复杂的SQL语句,并且有时候需要根据每条表记录的实际情况进行判断,根据每条记录动态添加不同的where条件,这个时候我们就可以在where语句中使用if语句进行条件判断,那么where if应该如何正确使用呢?
-
关于websocket多节点分布式问题的解决方案
websocket是一种在单个TCP连接上进行双全工通信的协议,使用websocket,我们可以实现服务端主动向各个订阅消息通道的客户端推送消息。这点比传统的http轮询请求要更好一点,避免一些无用的请求,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
-
mac如何把文件压缩成tar、zip以及如何解压tar、zip?
有时候我们需要把文件压缩成一个tar文件或zip文件,发送给别人,那么在macos系统应该如何压缩和解压缩呢?
-
openjdk和jdk有什么区别,应该如何选择?
我们一开始学习java的时候,安装的都是从sun官网或oracle官网下载的jdk安装包,但其实还有另外一个来源可以获取到jdk安装包,那就是openjdk,它和jdk基本一样,推荐使用openjdk。
-
如果git仓库发生变更,IDEA如何直接修改git远程仓库地址?
有时候我们整理远程仓库代码的时候,会修改远程仓库的名称,或者所属分组,这个时候在IDEA由于还是使用原先拉取的旧仓库地址,导致本地代码会提交不了,也更新不了远程最新代码,那么这个时候要如何修改IDEA当前的git远程仓库地址呢?如何无缝修改,修改完之后就能和原来一样更新提交,并且以前的提交记录也保留呢?
-
微信公众号自定义菜单报错:no permission to use weapp in menu rid:xxxxxxx
昨晚公司系统添加微信公众号菜单突然报错:{"errcode":45064,"errmsg":"no permission to use weapp in menu rid: 60311f70-0736ff08-29143906"}
-
Java如何使用stream流对List列表数据进行自定义排序
我们一般做排序功能都是通过在mysql数据库中的表中定义好排序字段,然后使用升序或降序来进行排序,复杂一点的话就配合多个排序字段进行排序,但是如果碰到那种无法使用表的字段进行排序的情况,我们需要先从数据库中取出列表数据,然后再通过业务代码对列表进行排序,这个时候我们就可以使用redis或Java的stream流。
-
微信企业付款到零钱报错:此请求可能存在风险,已被微信拦截
具体错误信息:com.github.binarywang.wxpay.exception.WxPayException: 返回代码:[SUCCESS],返回信息:[支付失败],结果代码:[FAIL],错误代码:[NO_AUTH],错误详情:[此请求可能存在风险,已被微信拦截。]
-
springboot项目使用@Transactional注解如何避免长事务问题
在springboot项目中,我们开启事务是非常简单的,使用注解的方式就是在需要开启事务的方法上添加@Transactional,这样就可以实现这个方法里面的所有操作和调用方法的操作都绑定在一个事务上面,要么全部一起执行成功,要么全部一起执行失败,如果其中有某个地方抛了异常,则整个方法涉及的事务操作都会回滚,但是如果随意滥用@Transactional,又有可能引发长事务问题,导致数据库死锁、数据库连接池占满等问题。
-
css实现“展开阅读全文”功能
最近发现很多博客网站,资讯网站喜欢把资讯博文,内容等这些大文本的信息在页面显示的时候都会有个“展开阅读全文”的按钮,点击这个按钮即可展开显示所有的内容,不然一开始就显示那么长的篇幅相对来说既不美观,又对用户体验不好。现在就让我来仿照这类网站实现一个“展开阅读全文”功能。这里主要用到的前端技术是html+jquery+css,只做展开功能,没做收起功能(收起功能没必要吧,谁会去收起呀???)。
-
关于编程中面向对象的理解,什么是面向对象
面向对象设计相对于结构化程序设计可以说是一种更优秀的程序设计方法。它的基本思想是使用类、对象、继承、封装、消息等基本概念进行程序设计。它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在软件系统构造中尽可能运用人类的自然思维方式,强调直接以现实世界中的事物(即对象)为中心来思考,认识问题。
-
我的linux操作命令总结,记录常用linux操作命令
平常本地开发项目使用的系统基本都是window系统,而且都是图形化操作,非常方便,window也是越做越好了,项目部署到生产环境一般都是选择linux系统(当然window server系列也可以),而linux一般则选择centOS居多,这里记录一下linux常用命令,以免老是过几天就忘了,后续不断补充。