讲学稿使用的一点体会2021年初,因为公司的业务需要而学习java,并应用java开发项目。由于项目时间紧,没有充裕的时间系统学习java,对java的学习只能是项目需要用什么,就学什么,这种学习方法的上手快,但不扎实,在以后的工作中,因为java学的不扎实,吃了不少苦头。现在我学习应用java已经有一年半的时间,对java已经有了一定的体会,把自己的体会写出来,供网友分享。
以我个人的经验,学习java应分以下几个阶段:java的语法学习面向对象观念的建立java基本类库的学习学习设计模式应用设计模式经过大量的实践,可以设计模式以上六个阶段,其中前三个阶段是针对java的,但java中,在很多设计模式的应用,同时有很多功能都支持设计模式,所以不懂设计模式的人是不会很好的应用java做开发的。第4、5个阶段的学习在前三个阶段的基础上,学习、应用成功的经验。从而进入第六个阶段,在软件设计这个领域尽情发挥。本人受能力所限,还处在第4个阶段的学习过程,所以会对前四个阶段说明。第五、六个阶段只是我根据我自己的知识做的推断,还没有经验无法说明。
在对这些学习阶段进行阐述之前,我先说一下我的学习方法。在学习新的知识时我通常是按以下三个阶段学的理论学习。通过对理论的学习,尽量了解新知识的概念;学习之后只是粗略的了解概念,不能和实际很好的结合。
演绎阶段。根据理论学习的知识,考虑在什么场合下可以应用这个新知识,哪些地方已经应用了这个概念,建立对新知识的感性认识。
归纳阶段。从一个更深的层次理解理论。
以下根据java的六个学习阶段阐述我的体会,而每个阶段将按照理论学习、演绎和归纳三个小阶段讨论。
java语法的学习语法学习的理论学习阶段是最容易的阶段,70%以上的java书主要介绍的就是java语法,随意买来一本,通读一下就可以,主要理解以下内容:(1)数据类型,(2)操作符,(3)控制流程,(4)类和类再生,(5)包和接口,(6)异常操作。
在理论学习阶段,不必过于注重细节,只要对java的基本语法有一个整体认识,能读懂示例的源代码就可以了。
下一步就是演绎阶段,应用所学的语法知识,编写简单的程序。最好凭自己的记忆,将各语法要点都用一遍(编写代码最好用notepad),对自己不熟悉的语法要重新阅读,用编译器去检查语法错误。这个阶段的目标是脱离书本以及javaapi能编写简单的程序,阅读一个java源代码能说出执行结果。
完成这个阶段的学习,参加scjp的考试,应该获得较高的成绩。
在演绎阶段的基础上,根据自己犯过的错误,总结一下java的难点。重新阅读语法书,将一些自己不是很清楚的概念重新整理一下,这时你对java语法的理解比第一次阅读时更深了。
我在刚开始学java时,只是粗略的看看语法书,就开始编程序了,遇到不懂的就重新阅读语法书,这样,完全可以成为一个合格程序员,但是当我成为teamleader时,为了培训组员java编程,却发现自己脱离了java语法书和javaapi,竟然会的不多(java集成开发工具有提示功能),为了培训,我又重新学了一遍java语法,很有收获。
其实一个优秀的程序员,不但要能写出好的程序,更重要的是,对所写的程序能说的清楚:(1)说清楚程序的功能(2)说清楚程序的结构。而说清楚程序的结构的基础是对java的语法要熟悉。想成为优秀的程序员,一定要在学习语法的基础上,不断实践,不断总结,最终能脱离语法书,将java语法系统的讲解清楚。
面向对象观念的建立java是面向对象的开发工具,使用java开发应用时,一定要懂面向对象编程的概念。在学过了java语法之后,应该建立oop的概念。
理论学习阶段,首先应当理解class和object,了解class、interface、abstractclass,理解oop的继承性,封装性(public,protected,private)和多态性。然后应当熟悉uml,可以阅读一些uml的简单资料,基本上了解类图、状态图和时序图就可以了。
演绎阶段,对oop的实践。而oop的成功范例应该是常见的23种设计模式。这个阶段需要阅读并体会设计模式uml图和示例代码,我推荐《java与模式》这本书,也可以访问http://www.xiexiebang.com/designpatterns/index.htm。不必读懂模式,只需要读懂每个模式的uml和代码。
归纳阶段,通过演绎阶段的学习,体会oop带来的好处——对扩展开放,对修改关闭。同时学会如何在java中使用oop的概念设计。
我在使用java编程初期,一直使用面向过程的思想编程,对class、interface、abstractclass以及public、protect、private的存在并没有理解,直到我阅读了gof的设计模式,才理解oop的优点。但是gof的设计模式太晦涩了,我第一次读时,仅仅是有了面向对象的概念,而对设计模式并没有理解。相反《java与模式》容易读一些,但《java与模式》一书的废话多一些,有很多内容可以不读。
java基本类库的学习曾经面试过一些java程序员,我出的题目是在使用java时,经常用到哪些类,在哪个包里。很少有人能答好,甚至有人做了2年java程序都没有回答出,他们会用java,但必须依赖工具(指java集成开工具),我觉得他们可以编写出程序,但不能编写出特别好得程序。
我认为作为java程序员必须掌握java类库的两个包:java.lang和java.util这两个包。java.lang包提供的是java编程要用到的基本类包,java程序员天天在用,无非是看别人如何用,自己就如何用,但很少有人去总结一下,比如string和stringbuffer这两个类有什么差别,应该有很多java程序员说不出来。另外vector和hashmap这两个类大家都在用,有多少人能说清楚vector和hashmap继承了哪些类,实现了哪些接口呢。
理论学习。认真阅读javaapi的以下内容。java.lang包中的string,stringbuffer,number,double,float,byte,short,integer,long,character,boolean,process,runtime,system,object,cloneable,class,classloader,thread,threadgroup,runnable,package类或接口。java.util包中的collection,list,set,arraylist,linkedlist,hashset,treeset,iterator,map,sortedmap,hashmap,treemap,comparator,arrays,enumeration,vector,stack,dictionary,hashtable,properties,stringtokenizer,bitset,date,calendar,locale,random,observer,observable类和接口。主要理清楚这些类或接口的继承关系、主要功能。
演绎阶段。通过阅读代码,练习编程,学习并应用这些类和接口。其实这些类的大部分是经常用的,无非对这些类和接口说不清楚。在这些类中,对java.lang和java.util包中的类,最好将各个方法练习使用一次。而对java.util包中collectionsframework中的类,最好理清楚各个类和接口之间的关系。常用的类的方法我就不具体介绍了,我举一个使用observer和obserable的例子(摘自《thecompletereferencejava2》)。在observer和obserable中,java实现了对设计模式observer的支持。
watcher.java代码importjava.util.*;classwatcherimplementsobserver{publicvoidupdate(observableobj,objectarg){system.out.println(”updatecalled,countis”+((integer)arg).intvalue);}}beingwatched.java代码importjava.util.*;classbeingwatchedextendsobservable{voidcounter(intperiod){for(;period>=0;period--){setchanged;notifyobservers(newinteger(period));try{thread.sleep(100);}catch(interruptedexceptione){system.out.println(”sleepinterrupeted”);}}}};observerdemo.java代码publicclassobserverdemo{publicstaticvoidmain(string[]args){beingwatchedobserved=newbeingwatched;watcherobserving=newwatcher;observed.addobserver(observing);observed.counter(10);}};执行结果updatecalled,countis10updatecalled,countis9updatecalled,countis8updatecalled,countis7updatecalled,countis6updatecalled,countis5updatecalled,countis4updatecalled,countis3updatecalled,countis2updatecalled,countis1updatecalled,countis0归纳阶段。总结使用经验,体会这两个包中类的继承关系,对设计模式的支持(如iterator本身就是设计模式,同时也是工厂方法模式的应用),了解这些类提供的所有功能,比较功能相近类的异同。将这些类的api记在心中。
虽然集成开发环境支持方法提示功能,但我个人认为,对于java.lang和java.util这两个包的api应当熟记于心,java的其他类库在使用时可以查找api。当然如果从事不同的开发,对其他类库应当有相应的了解,如开发swing,就应当对javax.swing包了如执掌,开发b/s结构的程序,就要了解javax.servlet,依个人的应用来开发了。
本文的上一篇发表之后,承蒙各位网友关注,发表了很多评论,我感觉很多人对我写得文章有误解,大概是我表述不清楚的原因吧。这篇文章是对上一篇的补充,以一个示例阐述了解collection框架的重要性。
我在半年以前写过一个函数printall(vectorvector),具体代码如下importjava.util.*;publicclassutiltool{publicstaticvoidprintall(vectorvector){system.out.println(”thecollectionisvector”);system.out.println(vector.getclass.tostring);iteratoriterator=vector.iterator;while(iterator.hasnext){system.out.println(iterator.next.tostring);}}publicstaticvoidmain(string[]arg){vectorvector=newvector;vector.add(newinteger(1));vector.add(newinteger(2));vector.add(newinteger(3));utiltool.printall(vector);}}printall这个函数设计的很不好——不够通用,假如,还想打印hashset类型的数据,你就必须重载printall函数,代码如下publicstaticvoidprintall(hashsethashset){system.out.println(”thecollectionishashset”);system.out.println(hashset.getclass.tostring);iteratoriterator=hashset.iterator;while(iterator.hasnext){system.out.println(iterator.next.tostring);}}printall函数的代码重用率低。其实vector和hashset都是collection的实现,可以将printall的参数类型改为collection,而不必重载。代码如下publicstaticvoidprintall(collectioncollection){system.out.println(”thecollectioniscollection”);system.out.println(collection.getclass.tostring);iteratoriterator=collection.iterator;while(iterator.hasnext){system.out.println(iterator.next.tostring);}}这样就可以删除printall(vectorvector)和printall(hashsethashset)函数了。
在设计函数时,应优先使用接口,而不是类。当然必须了解vector是collection的实现。
如果对collection的继承关系不清楚,很容易滥用重载,以下代码是一个有问题的代码(摘自effectivejavaprogramminglanguageguide)publicclasscollectionclassifier{publicstaticstringclassify(sets){return”set”;}publicstaticstringclassify(listl){return”list”;}publicstaticstringclassify(collectionc){return”unknowcollection”;}publicstaticvoidmain(string[]args)collection[]tests=newcollection[]{newhashset,newarraylist,newhashmap.values}for(inti=0;i。