“算法+数据结构=程序”是一句经典名言,这句话很直接的说明了程序的本质:处理数据、产生结果。即便是最简单的HelloWorld程序,我们也可以将字符串“HelloWorld”视作数据,将输出操作视作算法。

  但是在实际编程的时候,如何安置程序中的算法和数据就成了一个大问题。随着程序规模的增长,程序需要处理的数据可能会越来越多,需要用到的算法也会越来越多,以贪吃蛇为例,如果简单的将游戏需要的数据堆在程序的头部,就会变成下面的样子,各种互不相干的数据堆在一起:

  

  用于实现游戏的各个函数,也即算法,更是会多达几百行。一个贪吃蛇就已经如此“复杂”了,更遑论规模更大的程序。

  而这样多的数据与算法,就带来三个很直接的问题:

  1.修改、调试程序时难以迅速找到想修改的数据或函数

  2.数据可以被任意函数修改,从而可能被意料之外的算法处理,导致调试困难

  3.程序规模如果进一步扩大,给变量、函数进行命名时会越来越容易冲突,最后导致标识符越来越长。

  

  利用C语言进行编程时,如果要解决这样的问题,做法就是将部分数据和处理该部分数据的算法(函数)都放进单独源文件中去,然后在一个头文件中声明这些函数,再在主程序中通过包含该头文件以使用这些算法与数据。

  以一个C语言实现的推箱子编辑器为例,有关游戏内部资源的存储、处理都放进了一个单独的源文件中:

#include "PushBoxEditor.h"
//其他代码

//关卡信息存储区
;
][];

//当前关卡状态
;
][];

//资源存储
HBITMAP _hBitMap[];

//其他代码

  这样一来,主程序中就只要引入头文件“PushBoxEditor.h”,然后直接使用对应的函数即可:

//加载关卡数据
int loadResult = LoadMapData(hWnd);
if (loadResult == LM_FAIL_RESOURCE)
   ;

  这样的做法就是面向对象的雏形:将数据和相关的算法放在一起。

  但是C语言的这类做法还是有些不足,首先就是上面所说的第三个问题:命名冲突,并不能解决。比如实现一个3D游戏,对于3D模型数据,有一个函数叫Load,它们单独放在一个文件,而对于图像数据,也有一个函数叫Load,它们也单独放在一个文件,但是主程序对于这两个文件中的Load都要使用,该怎么办?如果程序规模小,一个人干,那无所谓,自己知道有这个冲突,把他们分别改成LoadModel和LoadImage就好了。但是这个做法在程序规模变大,有多人共同开发时就不行了,自己编写一个模块,还得先问清楚所有人,是否有用过某个名字,这太麻烦。

  其次是另一个更重要的问题:如果结构完全相同的数据,我需要不止一份该怎么办?假设我们将一个很复杂的结构体A和处理它的相关算法都单独放在了一个源文件,如果我们只持有一个A的实例,那无所谓,可是如果这个A我们需要很多份实例呢?比如字符串和处理字符串的各类函数,我们是可以将一个字符串和相关的函数单独放置,然后调用相应函数处理这个字符串,可是我们要同时持有多个字符串该怎么办呢?

  当然,即便是面向过程的语言,解决这类问题的方法也是一定有的,只不过解决起来可能很麻烦,比如数据在主程序中持有,相关的算法单独放置。但是面向对象编程可以更方便的解决这类问题。

  面向对象编程时有两个关键的概念:类与对象(也有一些语言称为对象与实例)。其中对象就是用于解决“不相关数据混在在一起”的问题,通过将相关的数据集合在一个对象内部,然后利用对象支持的方法去处理对象内部的数据,从而实现数据间的“独立”。而类作为制造对象的模板,恰好可以解决最后提出的问题:结构完全相同的数据,我需要不止一份。通过类去制造一个又一个对象,就可以获得一份又一份结构相同、互相独立的数据。

  写到这儿感觉没什么好写的……不想写了,就这样吧ε=ε=ε=ε=ε=ε=┌(; ̄◇ ̄)┘

JAVA学习:面向对象编程的更多相关文章

  1. JAVA的面向对象编程

    JAVA的面向对象编程 面向对象主要针对面向过程. 面向过程的基本单元是函数. 什么是对象:EVERYTHING IS OBJECT(万物皆对象) 全部的事物都有两个方面: 有什么(属性):用来描写叙 ...

  2. 使用Java实现面向对象编程

    使用Java实现面向对象编程 源码展示: package cdjj.s2t075.com; import java.util.Scanner; public class Door { /* * Doo ...

  3. Java学习——网络编程

    Java学习——网络编程 摘要:本文主要介绍了什么是网络编程,以及如何使用Java语言进行网络编程. 部分内容来自以下博客: https://www.cnblogs.com/renyuan/p/269 ...

  4. JAVA的面向对象编程--------课堂笔记

    面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么 ...

  5. 学习面向对象编程OOP 第二天

    好,今天继续学习这个面向对象编程.(根据博客园 小炒花生米写的博客学习而来) 一,封装性 a.把对象的全部属性和全部服务(方法)结合在一起,形成一个不可分割的独立单元 =>对象 b.信息隐蔽,尽 ...

  6. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  7. 学习面向对象编程OOP 第一天

    面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...

  8. Java基础--面向对象编程1(类与对象)

    1.类(class)的定义 类是对一组具有相同特征和行为的对象的抽象描述. 在程序中,引入类的概念,就是为了快速生成更多的具有相同特性和行为的事物. 2.对象(object)的定义 对象是类的具体实现 ...

  9. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  10. python 学习 面向对象编程

    面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行为了简化程序设计 ...

随机推荐

  1. openresty+lua劫持请求,有点意思

    0x01 起因 几天前学弟给我介绍他用nginx搭建的反代,代理了谷歌和维基百科. 由此我想到了一些邪恶的东西:反代既然是所有流量走我的服务器,那我是不是能够在中途做些手脚,达到一些有趣的目的. op ...

  2. yaf插件类的使用

    yaf插件类的使用大小写敏感的. "插件名Plugin"为插件类的名字,这样会自动标志着这是一个插件. application.directory string 应用程序的目录,包 ...

  3. foo的出现

    在计算机程序设计与计算机技术的相关文档中,术语foobar是一个常见的无名氏化名,常被作为“伪变量”使用. 从技术上讲,“foobar”很可能在1960年代至1970年代初通过迪吉多的系统手册传播开来 ...

  4. hive上mysql元数据库配置

    hive调试信息显示模式: ./hive -hiveconf hive.root.logger=DEBUG,console 非常有用. 默认情况下,Hive元数据保存在内嵌的 Derby 数据库中,只 ...

  5. ap module omap4460

    http://gitorious.org/ap-module-omap4460 Dashboard Register Login Activities Projects Teams ap module ...

  6. 判断一个jquery对象是否为空

    今天用jquery $获取一个jquery对象.$("#id") 然后用判断这个对象是否存在,id不存在的时候,判断这个是否存在, if($("#id")) 始 ...

  7. 部署Java Web项目报错(二)

    在编写HighCharts折线时,并且数据源是请求CSV,运行项目时出现错误 Uncaught TypeError: Cannot read property 'prototype' of undef ...

  8. String getProperty(String key, String def)

    String getProperty(String key, String def) 获取用指定键描述的系统属性. * 若key 系统环境或properties等配置文件的键,如os.name等,返回 ...

  9. 图解MBR分区无损转换GPT分区+UEFI引导安装WIN8.1

    确定你的主板支持UEFI引导.1,前期准备,WIN8.1原版系统一份(坛子里很多,自己下载个),U盘2个其中大于4G一个(最好 准备两个U盘)2,大家都知道WIN8系统只支持GPT分区,传统的MBR分 ...

  10. ucos-ii的任务调度机制

    1.在ucos-ii中,有这么几张表来管理任务. A.OSTCBPrioTbl[],其结构为OS_TCB指针的数组,其元素个数为64, 每一个元素对应一个任务的优先级,ucos-ii最多可以有64个任 ...