Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1791554
  • 博文数量: 787
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5015
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-22 15:17
文章分类

全部博文(787)

文章存档

2008年(787)

我的朋友

分类:

2008-09-25 16:11:07

 [@more@]

这个将是很容易被忽视但是极端重要的东东?JAVA元素在内存中的分配情况。首先假定你有STACK堆栈的概念,它是内存中的一个部分,特性是数据访问是先进后出,后进先出,这里你要明白这8个字有个隐含的约束,就是时间,如果你要明确数据进出的顺序,就要明确它们进出的时机,主要是出栈的时间,就是说你要明确指出什么时候这个数据应该出栈,这样才能保证先前进栈的数据有机会出栈。还有就是堆的概念,堆是程序运行时大量OBJECT对象存在的空间,你要有个形象的想象图,不要以为计算机是在神奇地凭空完成程序,就象自然万物数据也是要有空间才能存在的,回顾刚才说到的堆栈以及它的特性,先告诉你它被用来存放基本数据类型和REFERENCE引用,什么是引用呢,书上说它是指向OBJECT物体的东西,用它来访问具体的OBJECT,那为什么不直接访问OBJECT呢?我猜想有如下原因(不一定是事实,也不是无道理),首先是因为效率,访问堆栈的速度要比堆快,因为堆相对堆栈比较无序、无组织性,你也许要问,那为什么不把OBJECT对象放到堆栈里呢,那样不是更快么?别忘了OBJECT和自然物体一样也有属性的,属性不好理解,你就当它是体积、重量什么的吧,把OBJECT放到堆栈是不可能的,堆栈容纳不下(我猜测堆栈的大小是固定的值而且不会很大),即使能容纳下个别的OBJECT,注意OBJECT的体积可不全一样。明智的方法是用REFERENCE做个标示,假设你在一个阿拉伯国家当老师,那里的人名字可是很长的,又假使你很熟悉你的每个学生所以不会认错人并且你给他们每人一个固定的学号,上课时你要叫学生回答问题,你选择叫他们完整的全名呢(阿拉伯国家叫全名以外的外号和缩短的名字是不尊重的行为,也许吧,哈哈),还是叫他们的学号?REFERENCE引用就好比学号吧。另外还有STATIC静态内存区,是用来专门保存静态数据的,他们有着特殊的作用和意义,先不说这个。前面说到的这些还不完全,但有一点可以肯定,明确了解他们会使你更快地掌握编程语言,帮助理解和分析具体的程序,这些对学习任何一门语言来说都同样重要。

   现在来说一下OVERLOAD和OVERRIDE这两个概念,不幸的是这两个非常重要的概念被许多人错误地理解了,真是要细细说道一下。首先,看这两个英文单词:OVERLOAD?
   超载,过载,重载,超出标准负荷;OVERRIDE:重置,覆盖,使原来的失去效果。这两个词在外国人来看绝对不会弄混,可换了国人恐怕没几个初学者能搞得明白,问题在哪呢?我来告诉你,就在这个“重”字上,有许多人(包括我的大学C++课老师)读OVERLOAD的中文译名为?重(chong 二声,升调)载,实际上应该读(zhong 四声,降调),OVERRIDE的中文译名是?重(chong 二声,升调)置,把重载和重置混为一体了,接着就有人把二者混用,原因主要还是对二者的涵义不明晰。先说OVERLOAD,其实OVERLOAD和OVERRIDE不是什么具体的东西,二者都是机制,OVERLOAD我喜欢叫它超载,是对函数而言(如果不知道什么是函数……那你不要看了)也就是方法(JAVA的函数标准称谓),这里引用一个经典的说明:你怎么表达洗东西,是不是说洗手、洗车、洗衣服之类的?这些你平时再也熟悉不过的词语的涵义是什么你真的清楚吗?比如洗车怎么洗,洗手又怎么洗,它们是相同的过程吗?你肯用洗车的方式洗手?还是用洗衣服的方式去洗车?懂了吗,尽管你说话的时候没有明确地说我要洗我的手,用洗手的方式;或者我要用洗衣服的方式洗一件衣服。不需要那样麻烦地表达,这就是超载的意思了,具体的语法用我解释吗?好吧,OVERLOAD超载是指在同一可访问区内被声名的、几个、具有不同参数列的(参数类型/个数/顺序,不同)、同名函数,程序会根据不同的参数列来确定需要调用的函数,这种机制叫超载,超载不关心函数的返回值类型(返回值类型及其为何不能作为超载函数的判断因素在这里不描述)。OVERLOAD覆盖是指派生类(派生类这里不做描述)中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。明白了没?这两个看似生僻怪异的机制可是以后编程中经常用到的哦。

     先写到这里了,提醒大家一下如果没有英语基础还是别学编程了,不然困难会很大,99%的技术文档都是英文,MICROSOFT的MSDN应该有中文版本。另外90%的优秀书籍都是英文版本,比如BRUCE ECKEL的大作 “THINKING IN XXX”系列在他的网站直接提供电子版本的免费下载,很棒的书,目前免费电子版已经出到第3版。相信国内很多人都知道“侯捷”这个台湾人,他曾翻译过前面提到的B。E。大师的“THINKING IN JAVA Second Edition”,该书口碑极佳,书中对全数的名词术语的翻译比较精准,基本表达了原作者的意思,也是我看过的JAVA书中最为出众的一本,可惜世上无完美,由于侯先生是台湾人,书中使用的词语有的偏重台湾化,尽管他已经在序中说明将尽量使用大陆的构词习惯,有些地方还是差强人意。我在这里强烈推荐中级和刚入门的朋友吃透这本书,书中的知识点阐述相当详尽(个人认为不完美,其实没有什么是完美的),函盖了大部分重点要素,是一本系统学习JAVA的好书,但要注意,该书不是面向从零开始的读者,使用者应该至少具有C或VB的语法概念,最好是懂点C,比如理解C中的数据类型概念、基本IF语句、变量声明什么的。在前面提到的TIJ 2nd版本中随书带有1CD,里面包括了B。E。所著的“THINKING IN C --foundation for learning JAVA/C++”电子版,是学习JAVA的基础。该书据说可在B。E。的网站找到,可能我笨,没找到。在这里希望大家多看英文原版书,大部分的优秀书籍都只有英文版可以看一下,因为译者的功力实在有限,有的译本简直惨不忍睹,真该扁那些出版社,没本事学什么人家出书嘛!另外,本土的作者水平普遍不高,而且书写的比较没有章法,个人感觉有的象无头苍蝇到处乱撞,细节交代不清,可能写得连作者都不知其所云,就此收笔,主次轻重不分、不从读者角度考虑、看了之后有十万个为什么的想法;有的象蜻蜓点水,什么都只触及皮毛,当作简介尚可,做教程看了也白看。大家也不要盲目地看英文书,外国也有不会念经的和尚,不要轻信书评和受欢迎度,我就看过几个据说很有水平作者的拙作,很是糟糕,有的书甚至连基本原理都有错误,比如我曾亲眼见过有本书中写到:JAVA语言里为原始数据类型分配的内存空间随具体实现的机器不同而不同。这样的书看了无异饮鸩止渴呀!建议大致看一下全书,然后对比较熟悉的几个地方仔细看一下,如果发现作者或译者有明显错误就放弃它。还有,如果一本书读了大半也觉不出什么新领悟的东西,就说明这本书内容和你掌握的重复,不要细读了。好书真的会说话,每次看到一个新的亮点就是它在和你交谈。至于那些高手嘛(再高的高手也有手软的时候)光看技术文档就可以了。这里提醒大家技术文档十分重要,一个不看技术文档就写代码的程序员永远也不是合格的程序员!希望大家多读完整无错的原代码,对编程进步很有帮助,不要着急去调程序,没会说全话就想唱歌,唱的出来么?等到需要实际动手的时候就去做,那时侯你就知道自己并不是什么都行的,实际情况和你计划好的会有出入,是不是有的标准类函数记错了呀,拿起书再看看吧



--------------------next---------------------

阅读(560) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~