面向对象

首先,一言不和先百度,得到如下定义:

一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。

我们知道,编写程序的目的是为了解决现实生活中的问题,编程的思维方式也应该贴近现实生活的思维方式。面向对象的编程方式就是为了实现上述目的二出现的。它使得编程工作更直观,更易理解。需要注意的是这里说的编程不光是coding还包括了设计的过程也是面向对象的

为什么说面向对象更贴近实际生活

想象一下,当我们向别人描述一样事物时,我们都是怎么说的?"它有像鸭子一样的嘴巴","它有4条退","爪子里还有蹼","它是哺乳动物但却是卵生"。

这种HAS A 和 IS A的表达方式往往可以简单而高效的描述一样事物。HAS A描述事物的属性或行为,IS A 则说明了事物的类属。

当我们把这一系列的属性组合起来便得到的鸭嘴兽这一类,同时哺乳动物一词简单精炼的表面了所有哺乳动物的特性而不用一一列出,这是继承特性的体现,同时卵生又是多态的体现。

这就是面向对象的思维特点,抽取(抽象)有用的属性和行为(抛弃哪些无需关系的)组织(封装)成一个类。这个过程中你也许会发现很多属性或方法是和另一个类相同的,那么你就可以采用继承的方式避免重复(当然这个过程也有可能是,当你设计完一个个类后,才发现他们有共同点,然后再抽取出基类)。更重要的是,继承是可以不原样照搬的,我们可以通过重载实现相同行为或属性的特有实现方式,这种特点称之为多态,例如同样的生产行为,实现方式由胎生变为卵生。请大声念出,并牢牢记住面向对象的四个特征:

  • 抽象

  • 封装

  • 继承

  • 多态

与早期结构化编程相比

早期结构化编程是面向过程的(功能),换句话说程序是由功能的集合组成,而调用者是作为功能的参数传入的。而在面向对象的程序中,对象是主体,程序是由对象的集合组成。一个对象中包含一系列符合设计的功能供其他对象调用。这么说可能还是比较抽象,

例如当我们设计一个五子棋游戏时,面向过程的设计思路就是首先分析问题的步骤:

1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。

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

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

1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。

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

(以上例子来自国内著名问答社区)

随便写点代码,大家看看就好,不要太认真....

  1. /**

  2. 玩家类

  3. **/

  4. public class Player {

  5. String name;       //棋手名称

  6. boolean isFirst;  //是否先手

  7. int color_flag;  //代表颜色  0-白 1-黑

  8. Table table;//棋盘对象

  9. public Player(String name,boolean isFirst;int color_flag){

  10. this.name=name;

  11. this.isFirst=isFirst;

  12. this.color_flag=color_flag;

  13. }

  14. /**

  15. 下棋,x,y为落子坐标

  16. **/

  17. public void play(int x,int y) throws Exception{

  18. if(this.table==null){

  19. throw new IllegalArgumentException("玩家还未注册到棋盘!");

  20. }

  21. table.setNewPieces(x,y);

  22. }

  23. public void setTable(Table table){

  24. this.table=table;

  25. }

  26. }

  27. /**

  28. 棋盘类

  29. **/

  30. public class Table{

  31. List<Player> playerList=new ArrayList<Player>();

  32. Referee referee ;

  33. public Table(){

  34. referee =new Referee(this);

  35. }

  36. /**

  37. 注册玩家

  38. **/

  39. public void registPlayer(Player player) throws Exception {

  40. //检测棋盘中的玩家是否已满,先手玩家和玩家选色是否冲突。

  41. .......

  42. playerList.add(player);

  43. player.setTable(this);

  44. }

  45. /**

  46. 落子

  47. **/

  48. public void setNewPieces(int x , int y){

  49. //重新绘制棋盘

  50. ......

  51. //调用裁判对象,判断结果

  52. if(referee.isEnd){

  53. End();

  54. }

  55. }

  56. public void End(){

  57. .......

  58. }

  59. }

  60. /**

  61. 裁判类

  62. **/

  63. public class Referee(){

  64. Table table;

  65. public Referee(Table table){

  66. this.table=table;

  67. }

  68. public boolen isEnd(){

  69. //判断输赢

  70. ....

  71. return false;

  72. }

  73. }

然而事实上,通过上述示例代码,我们不难发现,即使我们使用面向对象的方式,上面例子里面向过程中提到的几个下棋过程我们还是都实现了的,只不过程被封装到了类的方法中。所以说其实面向对象和面向过程并不是编程的区别(需要实现的业务逻辑的量不会产生变化),而是设计的区别!

类与对象

类是抽象的,而对象是具体的

如何理解上面的话呢? 例如鸭嘴兽是类型,具体的鸭嘴兽A、鸭嘴兽B就是对象了。在JAVA中对象是通过new关键字声明的。 再例如,《红色警戒》中美国大兵是一类兵种,点击制造后从兵营里出来的那个会开枪的家伙就是对象了:

类的定义就是一个模板,它描述的一类对象的属性与行为。类往往是抽象的、没有实体的。哺乳动物是类的概念,是抽象的,现实中没有哺乳动物这一实体,只有具体的如老虎,狮子等。编程工作中套用这一思维模式,我们将程序中的实例抽象为类,例如一个系统中的用户有张三、李四我们会把他们抽象为Person类,或者称之为一个名为Person的数据类型。

对象则是根据所属类模板创造出来的实实在在的事物。在程序中我将这个实实在在的事物称之为实例,我们为它的属性赋上特定的值,让它成为张三或者李四。在内存里来说,对象是表示的就是具体数据。

前面说的都是概念性的东西,下面我们说说实际的运用过程中的理解。

从数据类型来说

以java为例,数据类型分为基本数据类型和引用数据类型。

基本数据类型就是byte,short,int,long,double,char,boolean;其它的,需要用到new关键字来赋值的都是引用数据类型。 类与对象指的便是引用数据的类型与其值(这里指的类不光是class,还包括接口、数组、枚举、注解)。 而引用指的是内存地址的引用,关于这点在后面说的内存时会细说。

看下面的代码:

  1. int a =1;

  2. Person b=new Person();

a 和 b 都是本身无意义的变量名。需要关注的是:a的类型是基本数据类型int值为1,而b的类型是Person属于引用类型,其引用的是new Person()这个对象。我们往往会说对象xx,比如这里的对象b。但实际上b只是对象的引用,真正的对象是后面的new Person()!

需要注意的是String也是引用数据类型,只不过因为使用率非常高,所以对于String,jvm支持其可 以像基本数据类型一样使用:String a = "abc"; 同等于 String a = new String("abc");

总之呢,简单来说类指的的引用数据的类型,对象是具体赋的值。为了更深入理解,我们下面需要解释下这个引用是如何体现的。

什么是引用(从内存来说)

要深入理解什么是类,什么是对象,什么又是引用,就离不开说说java的内存使用方式。

在java中内存被大致划分为栈(stack)与堆(heap) (之所以是大致,是因为还包括其它几部分就不在这细说)。

关于什么是栈与堆在这就不细说,有空我再整理一篇文章详细说明。

在这里我们只说一点:java中,基本数据类型以及对象的引用都保存在栈(stack),而对象则保存在堆(heap)中,例如当如下代码:

  1. int a=1;

  2. Person p;

内存中的状态大致如下:

int a = 1 是直接在栈中开辟空间,而对于未进行实例化的Person p因为没有有效的内存地址引用它的值是null。而当代码进行如下修改时:

  1. int a =1 ;

  2. Person p = new Person();

内存中的状态大致如下:

Person p=new Person();使得p的值=0x8da23也就是对象new Person();在堆中的地址。所以,到这里后就不难理解之前说的对象的引用了,所谓引用其实就是堆内存地址的引用。

总结

随着计算机技术的不断提高,现在计算机不单单是用来解决运算问题,而是被用于解决越来越贴近现实生活的复杂问题。面向对象就是这一发展进程的产物,它使得编程工作更贴近人的思维方式,从而大大提升编程效率。我们必须明白的是面向对象并不是一种编程方式,而是一种编程思维方式,这种思维方式涵盖了分析,设计,编码等。在面向对象编程中,程序的基本单元是对象,数据封装在对象中。类是对象模板,是预定义好的结构,所谓的实例化一个类,所指的就是将数据填入模板。

最后,本人文笔不是很好,有待提高。写文章和博客的最大目的是梳理自己的思路,其二是分享自己的想法,望大家多多吐槽,愿共同提高。

转载于:https://blog.51cto.com/tuziwo/1862977

面向对象和面向过程的区别个人觉得是目前解释最好的相关推荐

  1. python面向对象和面向过程的区别_Python11-01_面向对象----面向对象和面向过程的区别...

    面向对象编程 面向对象(OPP)编程思想主要针对大型软件设计而来的.面向对象编程使程序的扩展性更加强,可读性更好.使得编程可以像搭积木一样简单. 面向对象编程将数据和操作数据的方法封装到对象中,组织代 ...

  2. python 递归函数_Python尚学堂高淇|P82P86面向对象和面向过程的区别LEGB规则nonlocal_global递归函数阶乘计算案例...

    P82-递归函数-阶乘计算案例 #使用递归函数计算阶乘def factorial(n):if n==1:return 1else:return n*factorial(n-1)result=facto ...

  3. C++ 面向对象与面向过程的区别与联系

    转自:https://blog.csdn.net/jerry11112/article/details/79027834 前言: 如果你很想搞明白面向对象是什么,面向过程是什么,或者说二者之间的区别是 ...

  4. java面向对象与面向过程的区别

    面向对象与面向过程的区别 面向过程与面向对象,只是一种思维方式的划分   面向过程 面向对象 区别 以分步骤的方式解决问题. 用方法组织代码. 以分类的方式解决问题. 用类组织代码. 共同点 细节上用 ...

  5. 面向对象与面向过程的区别与联系

    面向对象与面向过程的区别与联系 一.区别 面向过程强调的是功能行为,以函数为最小单位,考虑怎么做. 面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做. 面向过程的分析 ...

  6. Java面向对象和面向过程的区别

    面向对象,Obeject Oriented,是一种编程术语.面向对象是当今软件开发方法的主流方法之一,他是把数据以及对数据的操作放在一起,作为一个相互依存的整体,就是我们所说的对象.对同类对象抽象出其 ...

  7. 什么是面向对象?面向对象的特征?面向对象和面向过程的区别?

    什么是面向对象? 面向对象是一种思想,世间万物都可以看做一个对象,这里只讨论面向对象编程(OOP), Java 是一个支持并发.基于类和面向对象的计算机编程语言. 面向对象软件开发具有以下优点: 代码 ...

  8. 面向对象和面向过程的区别及面试问答

    面向对象和面向过程的区别 面向过程 :面向过程性能比面向对象高. 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机.嵌入式开发.Linux/Unix 等 ...

  9. 面向对象和面向过程的区别以及封装继承多态的优缺点

    面向对象和面向过程的区别: 1.思路不同 2.特点不同 3.优势不同. 面向过程是直接将解决问题的步骤分析出来,然后用函数把步骤一步一步实现,然后再依次调用就可以了:而面向对象是将构成问题的事物,分解 ...

最新文章

  1. SQL中内连接、外连接、交叉连接
  2. 一块钱哪里去了?--java浮点型背后的故事
  3. .Net下的签名与混淆
  4. 让win7提速几倍的10个方法
  5. OpenGL窗口属性
  6. tomcat quartz 被触发两次
  7. leetcode 214. Shortest Palindrome | 214. 最短回文串(Java)
  8. Log 日志的使用与重要性
  9. python数据结构-树
  10. 关系抽取---(三)基于文本的卷积神经网络(Text-CNN)的关系抽取
  11. 大数据是什么?与云计算有什么关系?
  12. 如何读取通用配置文件conf?
  13. 董宝珍:巴菲特是如何选股的?——从底层逻辑看巴菲特核心重仓股的思路、原则和条件...
  14. 安装Cab升级文件的6个方法
  15. LocalDate的isBefore和isAfter方法
  16. 层次状态机-HSM代码解析
  17. 官宣 .NET 6 预览版 6
  18. 利用计算机卸载,为什么我不能在计算机上卸载软件! !
  19. oracle 48101 block,db_block_size是操作系统块的原因?
  20. Devops之Gradle SpringBoot构建打包工程jar、搭建jenkins自动发布

热门文章

  1. 正则基础之——\b 单词边界
  2. UILabel的行间距,字间距处理
  3. 浙大1202 zoj1202
  4. 自动化设备的软件框架
  5. MFC的来龙去脉-----消息处理,找处理函数
  6. win32汇编指令汇总
  7. c语言中函数调用的原理
  8. C#实现局域网UDP广播--
  9. NullPointerException int java.util.List.size()
  10. qq远程控制电脑方法_【技术分享】教你远程控制别人电脑