JAVA学习:面向对象编程
“算法+数据结构=程序”是一句经典名言,这句话很直接的说明了程序的本质:处理数据、产生结果。即便是最简单的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学习:面向对象编程的更多相关文章
- JAVA的面向对象编程
JAVA的面向对象编程 面向对象主要针对面向过程. 面向过程的基本单元是函数. 什么是对象:EVERYTHING IS OBJECT(万物皆对象) 全部的事物都有两个方面: 有什么(属性):用来描写叙 ...
- 使用Java实现面向对象编程
使用Java实现面向对象编程 源码展示: package cdjj.s2t075.com; import java.util.Scanner; public class Door { /* * Doo ...
- Java学习——网络编程
Java学习——网络编程 摘要:本文主要介绍了什么是网络编程,以及如何使用Java语言进行网络编程. 部分内容来自以下博客: https://www.cnblogs.com/renyuan/p/269 ...
- JAVA的面向对象编程--------课堂笔记
面向对象主要针对面向过程. 面向过程的基本单元是函数. 什么是对象:EVERYTHING IS OBJECT(万物皆对象) 所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么 ...
- 学习面向对象编程OOP 第二天
好,今天继续学习这个面向对象编程.(根据博客园 小炒花生米写的博客学习而来) 一,封装性 a.把对象的全部属性和全部服务(方法)结合在一起,形成一个不可分割的独立单元 =>对象 b.信息隐蔽,尽 ...
- java学习面向对象之异常之一
一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...
- 学习面向对象编程OOP 第一天
面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...
- Java基础--面向对象编程1(类与对象)
1.类(class)的定义 类是对一组具有相同特征和行为的对象的抽象描述. 在程序中,引入类的概念,就是为了快速生成更多的具有相同特性和行为的事物. 2.对象(object)的定义 对象是类的具体实现 ...
- Java学习---面向对象的远程方法调用[RMI]
基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...
- python 学习 面向对象编程
面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行为了简化程序设计 ...
随机推荐
- mysql数据库 调优
mysql调优硬件配置网络带宽mysql运行参数慢查询日志网络架构多实例(一台服务器上运行多个数据库服务)分库分表 当一台数据库服务器处理客户端的请求慢时,可能是哪些原因造成? 硬件配置低:(内存 c ...
- shell脚本基础1 概述及变量
shell概述:在linux内核与用户之间的解释器程序通常指/bin/bash负责指向内核翻译及传达用户/程序指令相当于操作系统的"外壳" shell的使用方式:交互式--命令行: ...
- Netty(二):Netty为啥去掉支持AIO?
匠心零度 转载请注明原创出处,谢谢! 疑惑 我们都知道bio nio 以及nio2(也就是aio),如果不是特别熟悉可以看看我之前写的网络 I/O模型,那么netty为什么还经常看到类似下面的这段代码 ...
- windows下用pip安装软件超时解决方案
以前介绍过ubuntu下更换更新源办法,详情见http://www.cnblogs.com/Alier/p/6358447.html 下面讲一下windows下面pip的配置更改,包括下载软件是超时错 ...
- Android WebView编程的那些坑(一)
最大的坑是ROM不同,webkit不同,差异性很大.再加上google的坑,真是坑上加坑.比如js注入问题,比如client回调接口时序问题, 比如内存回收问题,etc 1.内存泄漏问题,尤其注意An ...
- 笔记本CPU低压和标压有什么区别?
笔记本CPU英文称Mobile CPU(移动CPU),它除了追求性能,也追求低热量和低耗电,最早的笔记本电脑直接使用台式机的CPU,但是随CPU主频的提高, 笔记本电脑狭窄的空间不能迅速散发CPU产生 ...
- php 连接mssql
以前用的都是mysql,今天突然想用下mssql,起先用的是sql server200. 第一种方法 打开mssql.dll拓展.然后把mssql.secure_connection = off改为o ...
- (二十二)java小练习三
练习七:计算1-100的累加和 package demo; /** * 计算1-100的累加和 * @author tuzongxun */ public class Test16 { pu ...
- JSP自定义标签配置
JSP自定义标签配置 JSP自定义标签 <taglib> <taglib-uri>/WEB-INF/you.tld</taglib-uri> ...
- net.at.json.JSONException
1.错误描述 严重:Servlet.service() for servlet [clientServlet] in context with path [/User] threw exception ...