面向对象理论概述

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…

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

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

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

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

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

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

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

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

块设备驱动介绍

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

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

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

netbeans搭建安卓开发环境

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

VS2010皮肤控件介绍

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

MySQL和Mariadb都启动不了了_linux centos7mariadb安装成功启动不了 解决思路

查看系统日志/var/log/mariadb/mariadb.log190313 14:31:03 InnoDB: Database was not shut down normally!InnoDB: Starting crash recovery.InnoDB: Reading tablespace information from the .ibd files...InnoDB: Restoring possible half-written data pages from the dou…

java 线程转储_获取Java线程转储的常用方法(推荐)

1. 线程转储简介线程转储(Thread Dump)就是JVM中所有线程状态信息的一次快照。线程转储一般使用文本格式, 可以将其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自动分析。Java中的线程模型, 直接使用了操作系统的线程调度模型, 只进行简单的封装。线程调用栈, 也称…

Oracle conn 协议适配器错误解决

Oracle conn 协议适配器错误 --解决方法C:\Documents and Settings\administrator>set oracle_sidmyoracleC:\Documents and Settings\administrator>sqlplus /nologSQL*Plus: Release 10.2.0.1.0 - Production on 星期三 12月 26 09:47:16 2012Copyright (c) 1982, 2005…

python给定一个整数n、判断n是否为素数_输入一个大于3的整数n,判断它是否为素数...

#include //让n被i除(i的值从2到n-1)int main(){int n,i;printf("please enter a integer number,n?");scanf("%d",&n);for(i2;i<n-1;i)if(n%i0) break;if(i",n);else printf("%d is a prime number.",n);return 0;}**************…

编译Ngnix遇到的问题,查看程序依赖的库文件

要点:ldd 可以读取每个可以运行的程序依赖的 so 文件。 编译的时候提示需要Openssl库. 查看本机,已经安装了openssl 查看编译报错文件,查找Openssl所依赖的库 more objs/autoconf.err 查看openssl所依赖的库文件 ldd /usr/bin/openssl ldd –u /usr/bin/openssl objdump -x ob…

[JavaWeb修行之路 Day1] 安装、配置、部署Tomcat

一、相关软件下载 Tomcat下载地址&#xff1a;http://tomcat.apache.org 。选择Tomcat 6或者Tomcat 7。Eclipse下载地址&#xff1a;http://www.eclipse.org/downloads/ 。选择Eclipse IDE for Java EE Developers进行下载。当然&#xff0c;也可以使用MyEclipse&#xff0c;收…

应用层为何不能设置分辨率

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 5、在应用程序中设置分辨率 &#xff08;1&#xff09;可视分辨率&#xff08;即实际分辨率&#xff09;、虚拟分辨率 &#xff08;2&#xff09;实验及结果 vinfo.xres 1024; …

Vagrant 快速入门

1. Vagrant功能: Vagrant uses Oracle’s VirtualBox to build configurable, lightweight, and portable virtual machines dynamically.. 【Vagrant 使用Oracle VM VirtualBox 动态创建和配置轻量级的&#xff0c;可重现的&#xff0c;便携的虚拟机环境。】 2. Vagrant下载: …

各种分页存储过程 (转)

在项目中&#xff0c;我们经常遇到或用到分页&#xff0c;那么在大数据量&#xff08;百万级以上&#xff09;下&#xff0c;哪种分页算法效率最优呢&#xff1f;我们不妨用事实说话。 测试环境 硬件&#xff1a;CPU 酷睿双核T5750 内存&#xff1a;2G 软件:Windows server 20…

ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?

症状&#xff1a; 类似上面的警告提示&#xff0c;运行程序不会有任何错误&#xff0c;但若干地方都提示警告&#xff0c;并且明明dll的引用都是正确的。 解决方案&#xff1a; 删除&#xff1a;C:\Users\{your computer name}\AppData\Local\Temp\Temporary ASP.NET Files 该目…

framebuffer驱动详解4——framebuffer驱动分析2(probe函数讲解)

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 主要在填充fbdev这个结构体。 二、framebuffer驱动分析2 1、probe函数分析 &#xff08;1&#xff09;struct s3c_platform_fb 这个结构体是fb的platform_data结构体&#xff1…