“算法+数据结构=程序”是一句经典名言,这句话很直接的说明了程序的本质:处理数据、产生结果。即便是最简单的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. BroadcastReceiver工作过程

    动态注册过程: ContextWrapper.registerReceiver--> ContextImpl.registerReceiver--> ContextImpl.registe ...

  2. C++ 中vector的使用方法(转)

    原地址:http://blog.csdn.net/duan19920101/article/details/50617190/ 在c++中,vector是一个十分有用的容器. 作用:它能够像容器一样存 ...

  3. Qt Creator 整合 python 解释器教程

    目录 1. 前言 2.前提条件 3.步骤 3.1 新建 python文件 3.2 编写 python 代码 3.3 配置 python 解释器 3.4 执行 python file 1. 前言 Pyt ...

  4. linux周期性计划任务 进程管理

    周期性计划任务crontab命令系统服务:/etc/init.d/crond(crond必须启动才会生效)用户计划:/var/spool/cron/用户名默认的计划任务全局配置:/etc/cronta ...

  5. R语言︱逻辑运算

    R软件包含两个逻辑值,TRUE和FALSE.在其他编程语言中也称为布尔值(Boolean values).布尔向量就是充满着逻辑值的逻辑向量.那么有如何的应用呢? 1.比较运算可以产生逻辑值  > ...

  6. R语言︱机器学习模型评价指标+(转)模型出错的四大原因及如何纠错

    笔者寄语:机器学习中交叉验证的方式是主要的模型评价方法,交叉验证中用到了哪些指标呢? 交叉验证将数据分为训练数据集.测试数据集,然后通过训练数据集进行训练,通过测试数据集进行测试,验证集进行验证. 模 ...

  7. Java导出防止小数显示不全工具类

    1.说明 在做项目的过程中,发现导出功能中的数据显示不全,如"0.4",会显示成".4":"-0.8"会显示成"-.8" ...

  8. lvs简单使用

    LB集群实现 硬件 F5 BIG-IP Citrix NetScaler A10 Redware 软件 1 lvs 2 haproxy 3 nginx 4 ats apache traffic ser ...

  9. 使用WebApiClient请求和管理Restful Api

    前言 本篇文章的内容是WebApiClient应用说明篇,如果你没有了解过WebApiClient,可以先阅读以下相关文章: WebApi client 的面向切面编程 我来给.Net设计一款Http ...

  10. WPF基础篇之移动特效

    前一段时间,在做动画特效的时候,在网上看到了一个水平移动控件的例子.里面用到了RenderTransform特效.在网上查找资料发现了一篇基础的文章: 文章源地址:http://www.ithao12 ...