千言万语直击对象本质

问题描述

《对象之所以成为对象》---就程序设计领域的面向对象编程的对象一词做深度解析什么是对象?对象是变量和方法的结合体,它就类似于我们现实生活中的事物。什么是类?类是具有相同属性和方法的集合,是对象的抽象。这是教科书上常用的描述方法。但我认为这种描述其实是最不负责任的。这种话谁都会说。我们所以看到的书都是这么说,大概也是缘于中国的一大特色--互相抄袭的缘故。他们中的大多数作者并不理解其中的概念,人云而亦云。--只要懂字便可以出书,这便是中国的特色。对于文字描述的事物(所谓的概念)和现实事物之间的理解,人脑要把它们联系起来,主观上并不容易,因为客观上它们之间是存在脱钩情况的。用计算机代码描述的对象(比如杯子)和现实存在的对象本身几乎可以说风马牛不相干。比特和原子本来就是不可联系的东西。要让我们再把由它们叠加起来的更为复杂的东西联系起来,不仅需要事先对计算机环境有所熟悉,更需要一定的想象力,通俗来说就是要让学生们明白为什么一段由所谓变量和函数组成的计算机代码就可以称为是杯子的,以便于跟现实的杯子这个活生生的东西勾结起来,虽然中间还需要想象,但这种想象已变成常人都能完成的思考能力了,我认为这就是理解对象概念的第一初始要素,也就是第一要给予关注的关键点。我在看来,要把比特物和原子物这两个本不相干的东西联系起来,唯一方法就是比较,通过对比把她们硬勾结起来。如果有人试图通过演绎或归纳的推理方式来把她们联系起来,那是比较幽默的。如何比较?指导思想其实很简单,就是让学生们明白一段代码怎么看起来就是现实中的杯子或是任何一件想表达的现实中存在的东西,比如一个美女。目的就是让学生们看到代码就同看到事物,即见码如见物。如何达到以上目的,这需要从一个最初始的问题开始,就是回答什么是程序和程序的功能是什么?简单说程序就是代码块,具体点就是由数据码和指令码组成的代码模块。这里需要突出的是数据和指令是组成程序的两个基本要素,缺一不可。注意:单独的数据或是单独的函数是不能工作的。并且一个程序除了数据就是指令,除了指令就是数据,再没有所谓的第三种要素。程序有什么功能?我们的回答是由一定量的数据码(变量)和指令码(方法或函数)组成的程序,只要给予适当的设计,理论上均可以给出任何我们需要表达的东西,这些东西的表现形式可以是屏幕模式也可以是内在的存储模式(我们想从程序得到的无非也就是这些形式的东西),它们可以是一个返回值,或是一个显示在屏幕上的东西,如文字、按钮、窗口、杯子、动画、美女等。并且由于包含了可以互为操作的变量和函数,所有这些程序都可以设计成具有响应用户操作动作(即所谓事件)的能力,如响应键盘和鼠标输入并给出相应的结果等,具体例子有命令按钮、对话框、滚动条、窗口拖动和放大缩小等。所以我们在vb里随便拉出一个控件便可以对它添加进入具有响应任意动作的功能模块就是这个道理。问题的实质是,一段包含变量和函数的代码模块里,我们把它设计成什么样的功能不可以呢?除非你想不到或是不愿意那么做。这就是我们所谓的类体或对象体(或有曰之控件、组件、部件,本质不过是一段小程序)里都可以具有所谓属性、方法和事件的原因。因为别忘了,它们是程序。话说到此大家可能已有所明白,实际是只要我们把编程模块也包含进一定量的数据和函数,也就具有了程序的特性,因此也自然的便有了表达任何事物的能力了,比如画杯子、窗口、美女和响应用户输入动作的对话框及勾画出一个播放器等等,也就是它实际就是一个名副其实的程序了,只是看我们想把它做成一个大程序模块还是小程序模块而已。问题的要害就在于此,目前我们所谓的面向对象的编程模式实际就是基于这样的思想开发出来的,就是把编程模块都做成包含数据和函数的小程序,这些小程序在语言中我们通常用类模块来表达。而既然类就是实际意义上的小程序,那么回答对象概念就变成一件简单的事情了。→因为类是一段小程序,因此其生成的所谓对象也是一段小程序;既然对象是一段小程序,那么它便可在内存模式或屏幕模式上表达出任何我们想要的东西,如一个桌子、一辆轿车、一个人、一匹马、一个小按钮、一段文字、一部电脑、一个美女、一幅动画、一门大炮、一堆土、一堆粪便、一只蚂蚁、一件衣服等等等等,并且所有这些东西都具有响应用户操作事件,除非你不设计进去。而只要你看到这些,你敢说它不是一种我们现实生活中的东西吗?敢说它不是我们现实生活中的对象体吗?至此,我们实际已明白地回答了上面提出的“如何比较?”即如何把比特物和原子物联系起来这一问题了。本来由代码和数据组成的程序模块(比特物)跟现实生活中的物品(原子物)是不相干的,但当我们把由代码和数据组成的程序模块时刻看作一不可分割的程序体时事情就不同了(面向对象语言就是刻意这么做,它们一般都由class语句来加以界定),因为按照程序功能的观点,这个程序体是可表达任何我们想表达的现实中存在的物品或事物的,所不同的是这个物品是画在屏幕上或表达在内存里,但从影象学的观点看,一个按照现实模型描画在屏幕上的物品(如杯子)应该不会影响我们把它当作现实中的杯子来看待,除非你是一个影象虚无主义者。最后我们要说的是:此文在回答“对象”这一概念时同样用了“函数和数据相结合”这种方法,但由于我们从程序观点这一更基础的知识层面去分析这种方法,所以我们在理解“对象”概念上就更显得有依据,就更容易从通俗的视角来把握“对象”概念了。附:类这东西无论在源程序还是二进制目标程序都随程序一起,属于程序的一个重要组成部分,多数对象倒是需要时即时由类生成的。个人感觉这倒是理解类的最根本要害所在。作品来源:http://hi.baidu.com/javami/blog/item/cf88df1b3d87f7d4ac6e756f.html

解决方案

解决方案二:
为了祖国技术的明天,自己顶一下!,真没办法呀,这个国度!:)
解决方案三:
从回帖就知道C#大概没希望了!!!
解决方案四:
事实是"类"不过是在原始的基本数据类型基础上稍做改动的技术,即将原来数据和函数分离的状况改为不分离.方法也很简单,不过在语言里加了一些诸如class的界定语句即可,从这可看出从原始数据类型到类的数据类型技术上只做了一点改动,所以也看出面向对象技术重要的不是它的技术,而是它的思想.从这也可看出,真正有威力的革命不一定需要惊天动地的技术改造,一顶点灿烂的思想同样可引发一场伟大的技术变革.点睛评论:主要是思想,而不是技术.

时间: 2024-11-20 12:24:08

千言万语直击对象本质的相关文章

ORACLE编译失效对象

在日常数据库维护过程中,我们会发现数据库中一些对象(包Package.存储过程Procedure.函数Function.视图View.同义词.....)会失效,呈现无效状态(INVALID).有时候需要定期检查数据库中存在哪些失效对象,对于存在异常的对象需要重新编译,有些自动失效的对象,一般会在下次调用的时候,会被重新编译,所以这些不需要人工干预.那么为什么对象突然会失效呢?又如何快速.高效的编译失效对象呢?哪些失效的对象不需要我们去重新编译呢? 数据库对象失效原因 数据库对象失效的原因很多,下

ORACLE编译失效对象小结

在日常数据库维护过程中,我们会发现数据库中一些对象(包Package. 存储过程Procedure.函数Function.视图View.同义词.....)会失效,呈现无效状态(INVALID).有时候需要定期检查数据 库中存在哪些失效对象,对于存在异常的对象需要重新编译,有些自动失效的对象,一般会在下次调用的时候,会被重新编译,所以这些不需要人工干预.那么为什 么对象突然会失效呢?又如何快速.高效的编译失效对象呢?哪些失效的对象不需要我们去重新编译呢? 数据库对象失效原因 数据库对象失效的原因很

盘点对象存储九大关键点

 有评论表示,对象存储是一个相对新的市场部分,目前继续稳步增长,并有更多值得采用的理由. 对于不了解的人来说,对象存储用于保存大量的非结构化数据,其中每个"对象"本质上是没有特定格式的文件(也称为二进制文件).对象存储可以保存任何类型的数据,从人类可读的小对象文件到媒体(音频和视频)或其他行业特定的格式(石油和天然气,医学成像等). 与传统存储相比,使用对象存储的好处是多方面的.基于块的系统(例如光纤通道和iSCSI)不能很好地向外扩展,并且对存储的数据没有真正的理解.它们是以低延迟和

[CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系

原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自System.Object class Employee { ..... } //显示派生子 System.Object class Employee : System.Object { ..... } 由于所有类型最终都是从System.Object派生的,所以可以保证每个类型的每个对象都有一组最基本

java-Java中线程的问题:明明是同一个thread对象,但是threadLocal不是同一个

问题描述 Java中线程的问题:明明是同一个thread对象,但是threadLocal不是同一个 package hub; /*为啥不同线程中的ThreadLocal是互相独立的. 明明是同一个thread对象 打印出来的结果 在主线程里面是var2 ,在thread线程中是var1 */ public class ThreadLocalUsage extends Thread { public User user = new User(); public User getUser() { r

初学者必须掌握的jsp九个内置对象

JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1.request对象 request 对象是 javax.servlet.httpServletRequest类型的对象. 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据.(包括头信息.系统信息.请求方式以及请求参数等).request对象的作用域为一次请求. 2.res

类库与框架,强类型与弱类型的闲聊

    有一天,我问一个同学说,"如果让你通过程序开发一个虚拟地球出来,模拟不同的人的行为,模拟天气,地理,人文,股票涨跌,模拟情感,思考,数学,你怎么做?"那哥们眼睛一亮,马上就说,以人为例.教师,官员,学生,工人都不一样,都从人这个基类继承!天气可以定义一个天气接口,通过工厂模式提供一组天气的集合-       我问,突然哪一天,你需要加一个字段,定义学生是不是程序员!他说,那加一个字段就好了.我说,代码都发布出去了.那哥们开始冥思苦想了.总之你发现,不可能预知未来的需求!人的类型

[C#]中abstract类和interface概念和区别讲解

  abstract(抽象)类和interface(接口)是面向对象编程中两个概念,但是学了很多年编程的程序员有时对这两个概念的区分仍然不是很清楚.下面就讲解abstract类和interface的概念和区别. abstract(抽象)类 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法. 抽象类不能被实例化. 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类. 具体派生类必须覆盖基类的抽象方法. 抽象派生类可以覆盖基类的抽象方法,也可以不

AJAX入门之深入理解&#106avascript中的函数

ajax|函数 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.javascript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语法: function func1(-){-}var func2=function(-){-};var func3=function func4(-){-};var func5=new Funct