JAVA学习经验之谈
2008-01-05 18:20:21 来源:WEB开发网核心提示:本文是我自2002年9月开始java学习以来的一点经验之谈,首先我不是有丰富编程经验的程序员,JAVA学习经验之谈,所以本文不对JAVA的具体语法、编程技巧和设计模式做过多的论述,仅从个人的学习角度谈感受,函盖了大部分重点要素,是一本系统学习JAVA的好书,由于有大学期间的C语言学习经历我对JAVA的基本语法相对来说比
本文是我自2002年9月开始java学习以来的一点经验之谈。首先我不是有丰富编程经验的程序员,所以本文不对JAVA的具体语法、编程技巧和设计模式做过多的论述,仅从个人的学习角度谈感受。
由于有大学期间的C语言学习经历我对JAVA的基本语法相对来说比较熟悉。最开始的几个星期我一直在努力理解JAVA语言运做方式和熟悉语法,分别包括JVM虚拟机的运做原理、JAVA程序元素在内存中的分配、JAVA是如何实现跨平台的可移植能力、及其JAVA为何被称为一种健壮的语言、APPLET小程序的概念;许多语言都通有的基本型别、流程控制语句、基本类库函数等等。到后来逐步了解了JAVA语言的一些特性比如JAVA对指针的处理、数组的特性、特有的接口功能(实现了C++的多继续功能,同时摈弃了相应的负面效果)、完善的异常处理机制、以及JAVA对流访问的实现方式、简化的网络编程、显式的线程定义等等。
其中熟悉语法的过程相当漫长,就是到现在我也不能说自己已经充分把握了其中的全部,因为JAVA提供的标准类库实在是个庞大的集合,以至于常用的类库只占其中的很小比例。
下面我将对不同的学习单元做较具体的说明。
首先应该是对OOP的理解,在充分把握OOP语言之前只能给出相对笼统的描述,如同管中窥豹只见一斑,OOP(OBJECT ORIENTED PROGRAMMING)面向对象的程序设计,字面上看是把对象作为主体,对象可理解为抽象的物体,这里先谈谈我对过程化程序语言的理解,许多资料描述PPL(PROCEDURAL PROGRAMMING LANGUAGE)用了一个“HOW”
,意思是说PPL描述了如何完成动作,当然完成动作的物体可以称之为OBJECT,所以我理解为PPL语言是在描述一个物体如何去做一个或多个动作执行程序任务,假如需要完成多个动作就需要多段代码,假如不同物体完成相同的任务也要重新写代码,这就造成浪费,另外,假如PPL中的部分代码需要修改,差不多肯定要影响到后面的部分,这造成维护的困难,由于PPL代码的功能和代码本身是密不可分的,所以隐藏重要代码成为不可能(为什么要藏呢?比如说你写了一个商用类库的第1个版本并且发放出去了,后来你发现前一个版本里有个函数有点不妥当需要修改或者干脆删掉,这时候问题来了,由于你的代码对用户是完全透明的,有的用户已经把你要修改的函数应用到自己的程序中去了,假如你改变了原来的代码,用户的代码也随即无法工作,这就是不使用实现隐藏的灾难,相信你的老板面临由你一手造成的两难境地时不会对你手软~)。下面该OOP了,它把一切事物都抽象为对象OBJ这和人类的思维方式相同,但是需要一点哲学的思想,所以我一直认为哲学和编程是紧密对应的,OOP优雅地解决了PPL的所有问题,实现了封装和代码重用,这就达到了信息隐藏和效率的提升,同时也降低了维护的成本,然而,我们是不是应该淘汰PPL呢,既然OOP这么优秀我们还有什么理由继续使用PPL呢,在我看来答案是否定的,为什么呢,大家知道C是一种过程化的语言,它是和UNIX一起成长起来的,几十年的时间以来它一直经久不衰,有存在就一定有原因,C被搞硬件编程的人称为高级语言,因为它和汇编语言相比确实要方便许多,假如你知道汇编语言的重要性同时也就明白了C语言的价值,就是对硬件的底层编码,高效率和可读性在C中被结合,C就是一种过程化语言,所以许多的过程化语言都将存在下去,他们有的语法简单易用、有的具备非凡的功能。PPL和OOP注定将共存,没有好与坏的区别,编程语言的发展就象人类的历史一样,以前人们知道通过捕鱼可以得到鱼吃,说不定哪天就出现专门在海里工作的自动捕鱼机,人们要做的只是到机器那去取鱼,而捕鱼的过程被封装在捕鱼机的机器里,这个比喻也许能帮助你理解OOP的概念,但这个不是全面,具体的要靠自己去理解。
下面谈JAVA特有的JVM(JAVA VIRTUAL MACHINE)吧,虚拟机这个概念不好理解,什么叫虚拟机?这和JAVA特有的可移植性有关,既然要可移动就不能和具体的计算机硬件有关,你这样想吧,假如WINDOWS机器是美国人,UNIX机器是法国人,APPLE机器是德国人,并且假设你只会汉语而且你是这三个只懂本国语言人的老板,你需要给他们布置工作,于是你找到他们三个,面对面讲话,他们谁也听不懂啊,所以你们在一起工作没有结果可言。所以你就想了个主意,你为他们每个人都配了个形影不离的翻译,你说话时对着翻译,翻译就把你的话解释给他们三人,OK,问题解决,你应该会问这样做不是要增加成本吗,没错,翻译的过程是要损失效率的,但这使你不至于什么事都做不了。现在你应该能多少了解JVM的概念了吧,就象个翻译。
这个将是很轻易被忽视但是极端重要的东东—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的好书,但要注重,该书不是面向
更多精彩
赞助商链接