“算法+数据结构=程序”是一句经典名言,这句话很直接的说明了程序的本质:处理数据、产生结果。即便是最简单的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. 第二十二章 Django会话与表单验证

    第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...

  2. hdu1394 分治 or 线段树

    利用分治求一次逆序数,然后每次把第一个元素放到末尾,设该交换元素的值为x,设上一次求得的逆序数为y,那么此时的逆序数等于y - x + (n - x - 1),减去x是因为x作为第一个元素,其后共有x ...

  3. java网络编程(7)——利用tcp实现文件上传

    其实客户端与服务端通讯的道理都是一样的,都是通过输入与输出这两个流,那么实现文件上传也就是同样的,客户端把文件读到文件流,服务端用文件流来接受,然后写到一个文件中,这样子就实现了文件上传,文件拷贝也是 ...

  4. ES磁盘分配不均问题

    最近es集群磁盘空间告警,日志又没地方可以迁移,然后申请了新的服务器,一次性加入8台新的服务器 新增了32个新的数据节点,至此,我们的主集群已经到达85个数据节点的规模,整个集群数据已达到PB级别,终 ...

  5. Apple 内购

    关于内购所需东西: 1.测试开发证书:需要打开in-app-purchase,绑定bundleid:com.aragon.TexasPoker 2.iTunes connect 里添加内购应用: 1& ...

  6. CEPH RGW 设置 user default_placement为ssd-placement,优化100KB-200KB小文件性能,使用户创建的bucket对象放置到 SSD设备的Pool上。

    sudo radosgw-admin metadata get user:tuanzi > user.md.json vi user.md.json #to add ssd-placement ...

  7. 嵌入式 RTP通话:视频流(H.264)的传输

    从摄像头获取的视频数据,经过编码后(当然,也可以不编码,如果你觉得也很ok的话),既可以 是  开始的数据是  00 00 40 00 40 11 C1 8C 94字节) 四.RTP视频传输代码 #d ...

  8. vue的ajax请求之axios

    axios.get(this.apiUrl+'good/info',{params:{'goodsid':'sp441153'}}) .then(function(response){ console ...

  9. Selenium简介与环境搭配-----Selenium快速入门(一)

    Selenium是一套自动化测试框架.官方网站是:https://www.seleniumhq.org/  某些童鞋访问可能需要FQ. Selenium支持多种语言开发,例如Java,Python,C ...

  10. .NET平台开源项目速览(21)Cron任务调度CronNET

    如果用知乎,可以关注专栏:.NET开源项目和PowerBI社区 Quartznet大名鼎鼎应该很少有人不知道,相关的开源项目很多,不过那东东对新手来说,有点晦涩,加上哪个Cron表达式,可能一进去云里 ...