面向对象理论概述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

转载自:http://my.oschina.net/brucelee80/blog

面向对象与面向过程的区别

    面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。


     例如五子棋,面向过程的设计思路就是首先分析问题的步骤:

1、开始游戏,

2、黑子先走,

3、绘制画面,

4、判断输赢,

5、轮到白子,

6、绘制画面,

7、判断输赢,

8、返回步骤2,

9、输出最后结果。

把上面每个步骤用分别的函数来实现,问题就解决了。


     而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:

1、黑白双方,这两方的行为是一模一样的,

2、棋盘系统,负责绘制画面,

3、规则系统,负责判定诸如犯规、输赢等。

 

    第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

    可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

    功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。

    到这里就可以很明显的看出面向对象和面向过程的区别所在了。

 

基本概念

抽象、封装、对象、类

    面向对象的思想来解决问题,首先要做的是分析该问题包括哪些对象。问题中的实体和概念都可以抽象为对象来考虑。如上面例子中的黑白双方、棋盘系统和规则系统等。

    对象具有属性、状态以及行为,状态是属性的值,行为是属性的逻辑操作。对象都属于某个类,而每个对象都是某个类的实例。一个对象就是封装了数据及操作这些数据的逻辑代码的实例。

    对具有相同属性和行为的一组对象进行抽象,便成了类,它是对象的模板,而对象是类的实例化,每个对象都对类的属性赋予不同的状态,对象具有唯一性。

 

隐藏与访问控制

    封装并不只是简单的属性和行为的集结,更重要的是选择性隐藏与访问控制。隐藏和控制那些不想提供对外访问的属性和行为,提供出去的便是这个对象的服务与功能。对使用者而言,隐藏了对象具体的实现,又提供了对象可控的行为。访问控制提高了安全性,也使协作开发有章可循。

 

组合、继承

    现实世界中,类与类之间不是孤立的,它们是有联系的。

    组合是指一个类拥有另外一个类(包含关系),将一个类当做它自己的属性。比如班级类,就可以组合学生、老师这两个类,表示班级由学生和老师组成。

    继承是指两个类具有父子关系,父类也称为基类或超类,子类也称为导出类、扩展类或派生类。比如动物类是父类,而飞禽类和走兽类则属于子类,表示分禽类和走兽类都是动物类。凡是父类能用在的地方,都可以用子类来替代,因为子类就是父类,父类是子类的再抽象。比如说动物是生物,当然可以替换成飞禽是生物。

    父类的属性和行为,子类可以原封不动的继承下来,也可以重写,以实现每个子类之间各自的新特性。

    对象分析时,组合和继承到底选哪一个,是抽象分析和封装时需要考虑的,他们各有优缺点。组合和继承提高了对象的可复用性。

 

接口、抽象类

    接口规范了服务提供的约束。比如电脑USB插槽就约束了USB的各种规范,各种厂商生产的带有USB外接功能的数据线,都必须遵循这个接口约束规范。接口不可实例化,只有实现了接口的类才可被实例化成对象。

    抽象类则更像是一个半成品,它只实现了部分功能,而其他功能必须是它的子类去完成。比如公司下发一个申报流程,必须先让部门经理签字,再让部门HR签字,这个流程是实现了的,至于每个部门的经理和HR则要每个部门具体实施时才能确定。所以,抽象类(公司申报流程)也不能直接实例化(因为公司申报流程中根本没有具体的审批人),只能是它的子类(部门申报流程)才能被实例化对象并可用。

 

转型

    当类之间有继承关系时,我们就说子类是父类,这个过程其实就是将子类向上转型为父类,从一个专有类转换成一个通用类,这总是很安全的。相反,如果将父类强制转换为子类,称之为向下转型,向下转型需要强制转型,具有不安全性,因为通用类无法访问专有类的专有行为。比如猫类是动物类的子类,猫类可以抓老鼠,但是向下转型成动物可以抓老鼠,显然就说不通;反之,如果说猫类能行走,那么向上转型为动物类能移动,显然是安全的。

 

多态

    多态也叫动态绑定,或后期绑定。绑定是指方法调用和方法主体关联起来。前期绑定是指在编译时就可确定这种关联,而后期绑定必须在程序处于运行态时才能确定。

    在Java中,方法调用的默认方式是前期绑定(由编译器和连接程序实现),当方法出现方法的重载和继承时行为的重写时,那么编译期间就无法进行绑定,这就需要动态绑定。动态绑定使得同样的一个方法,可以有多种实现方式。

    比如动物类可以进食,当进食的是水时,它就和进食的是固体所表现的行为就不一样了,这种进食行为是动物类行为的重载,是多态的表现。又比如动物类有移动的行为,而子类飞禽类的移动是飞行,子类走兽类的移动是地面上移动,此时,对于动物类的移动行为,就是多态,当动物是飞禽,移动的行为就变成了飞行的行为,如果是走兽,这个行为又变成了地面上移动,而这一切,只有在运行期才知道,因为只有真正运行起来,程序才知道,这个动物到底是飞禽还是走兽。

    多态可以提供系统间的松耦合性。


转载自:http://my.oschina.net/brucelee80/blog

转载于:https://my.oschina.net/brucelee80/blog/284245

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

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

相关文章

网络设备驱动介绍

以下内容源于朱有鹏《物联网大讲堂》课程的学习,如有侵权,请告知删除。 一、网络设备驱动概述 1、什么是网络设备 (1)网络设备:物理网卡在linux中形成的体系软件表现。 (2)物理网卡&#xff…

HTML之二:body标记的属性及属性值

HTML之二&#xff1a;body标记的属性及属性值在HTML之一中&#xff0c;介绍了必须要写入的结构、title用于显示标题栏的内容、网页的内容大部分在body中编辑&#xff0c;下面简单介绍body常用的属性以及属性值。<body background"图片位置" #设置背…

山东理工ACM【2561】九九乘法表

九九乘法表 Time Limit: 1000ms Memory limit: 65536K 有疑问&#xff1f;点这里^_^ 题目描述 九九乘法表是数学学习的基础&#xff0c;今天我们就来看看乘法表的相关问题。《九九乘法歌诀》&#xff0c;又常称为“小九九”,如下图所示。你的任务是写一个程序&#xff0c;对…

java ajax 定时刷新_用ajax技术实现无闪烁定时刷新页面

function makeRequest() {var guid rnd();//记住给个随机数&#xff0c;不然的话有缓存var url "example_b.aspx?id" guid;createXMLHttpRequest();xmlHttp.onreadystatechange handleRefresh;xmlHttp.open("GET", url, false);xmlHttp.send(null);}/…

platform驱动开发套路、DM9000的一些分析

1、 模块加载函数&#xff0c;是通过platform_driver_register()、platfprm_driver_unregister函数进行platform_driver的注册和注销&#xff1b; 原先注册和注销字符设备的工作&#xff0c;被移交给platform_driver的probe()成员函数和remove()成员函数中。 第一句是将硬件信…

效果历史

现代文艺解释学和接受美学术语。德国哲学家伽达默尔认为&#xff0c;历史决不重复过去的东西&#xff0c;它是可能性与现实性、过去与现在的统一。解释者在效果历史的环境下发现自己所处的“情境”&#xff0c;他必须在此情境中借助他从传统中承袭来的偏见来理解传统。姚斯发展…

Java对数组的操作(二)——集合与数组的切换

在Java开发中经常遇见集合与数组的互相切换&#xff0c;怎样实现呢&#xff0c;呵呵呵&#xff0c;非常easy&#xff1a; import java.util.ArrayList; import java.util.Arrays;import java.util.HashSet;import java.util.List;import java.util.Set;public class Te…

java 项目中遇到的问题 和解决方案_Java开发遇到的问题及解决方案

一、java.lang.OutOfMemoryError 问题:myeclipse 内存不足,又显示内存溢出等问题怎么回事?(java.lang.OutOfMemoryError: PermGen space及其解决方法) 解决: myeclipse内存溢出之后,可以通过修改虚拟内存大小来解决,步骤如下: 1、设置Default VM Arguments 在myEclipse中…

Android企业级程序完全退出的解决方案

一、问题描述 在平常开发的过程中可以发现&#xff0c;很多开发者对于程序的退出都没有去认真的解决。一般要么是一个简单的finish&#xff08;只是退出当前的activity&#xff09;&#xff0c;要么是其他的方法&#xff0c;比如&#xff1a; 1、第一种方法&#xff1a;首先获取…

块设备驱动介绍

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、正确理解块设备驱动的概念 1、块设备和字符设备的差异 块和字符是两种不同的访问设备的策略&#xff1b;同一个设备可以同时支持块和字符两种访问策略&#xff1b;设备本身的物…

Centos 统计文件夹下文件和文件夹的个数

运营管理中经常会碰到关于文件统计的需求&#xff0c;近期在做系统迁移&#xff0c;正好做个备忘。关键词&#xff1a;d : directory- : 一般文件以下命令在需要统计的目录下进行&#xff0c;如&#xff1a;# cd 目标文件夹统计某文件夹下文件的个数# ls -l |grep "^-&…

java中有scoreframe类型嘛_java构造函数的三种类型总结

我们说构造函数能处理参数的问题&#xff0c;但其实也要分三种情况进行讨论。目前有三种类型&#xff1a;无参、有参和默认。根据不同的参数情况&#xff0c;需要我们分别进行构造函数的讨论。这里重点是无参构造函数的初始化也要分两种方法进行分析。下面我们就这三种不同的构…

内核链表的简介

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、内核链表的设计思路 1、普通链表的数据区域的局限性 如果链表节点要存储一个int类型的数据&#xff0c;可以在数据区域定义int data。但是实际编程中&#xff0c;链表的节点不会这么简单&#…

框架模式和设计模式的区别

框架模式和设计模式的区别有很多程序员往往把框架模式和设计模式混淆&#xff0c;认为MVC是一种设计模式。实际上它们完全是不同的概念。[7]框架、设计模式这两个概念总容易被混淆&#xff0c;其实它们之间还是有区别的。框架通常是代码重用&#xff0c;而设计模式是设计重用&a…

netbeans搭建安卓开发环境

2019独角兽企业重金招聘Python工程师标准>>> NetBeans 上开发 Android 应用程序需要安装一个 Android SDK 和针对 NetBeans 的 Android 开发插件 下载并安装 Android SDK 下载 Android SDK 解压后运行 tools\android.bat update sdk 进行升级&#xff0c;根据所选内…

Linux设备驱动模型4——基于平台总线的LED驱动实践

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 platform总线驱动代码分析 平台设备与平台驱动的注册_天糊土的博客-CSDN博客 一、有driver无device 本节把之前的LED驱动源码改写成平台总线制式&#xff0c;先实现platform_driver。 1、…

StringIO类的用途

import StringIO as SIOs1 "Hello" print id(s1) s2 "Hello" s1 print id(s2) sp SIO.StringIO() sp.write("Hello") print sp.getvalue() print id(sp) sp.write("Leon") print sp.getvalue() print id(sp) exit() 主要进行字符串…

VS2010皮肤控件介绍

在我们平时使用的各种工具中&#xff0c;如QQ&#xff0c;迅雷&#xff0c;以及各种空间等&#xff0c;都提供了一些换肤功能&#xff0c;可以让我们选择各种我们喜欢的界面。本文就对VS中常用的窗口程序做一个简单的换肤&#xff0c;利用一个dll文件来进行实现。 首先我们要加…

mimemultipart java_最佳实践 – 发送javamail mime multipart电子邮件和gmail

我有一个Tomcat应用程序需要发送确认电子邮件等。我已经用Javamail(mail.jar)编写了电子邮件发送多部分文本/ HTML电子邮件。我基于Java EE示例的代码。我在本地服务器上使用SMTP MTA。它的作品很棒在Outlook中&#xff0c;我看到了HTML版本。如果我将其拖动到Outlook垃圾邮件文…

framebuffer驱动详解0——framebuffer的简介

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、framebuffer的简介 1、framebuffer的含义 framebuffer的中文意思是“帧缓冲”&#xff0c;简称fb。 2、fb是虚拟的字符设备 fb是内核虚拟的一个字符设备&#xff0c;即它是用代码构建出来的&…