2002年初,因為公司的業(yè)務(wù)需要而學(xué)習(xí)java,并應(yīng)用java開發(fā)項目。由于項目時間緊,沒有充裕的時間系統(tǒng)學(xué)習(xí)java,對java的學(xué)習(xí)只能是項目需要用什么,就學(xué)什么,這種學(xué)習(xí)方法的上手快,但不扎實,在以后的工作中,因為java學(xué)的不扎實,吃了不少苦頭。現(xiàn)在我學(xué)習(xí)應(yīng)用java已經(jīng)有一年半的時間,對java已經(jīng)有了一定的體會,把自己的體會寫出來,供網(wǎng)友分享。
以我個人的經(jīng)驗,學(xué)習(xí)java應(yīng)分以下幾個階段:
- java的語法學(xué)習(xí)
- 面向?qū)ο笥^念的建立
- java基本類庫的學(xué)習(xí)
- 學(xué)習(xí)設(shè)計模式
- 應(yīng)用設(shè)計模式
- 經(jīng)過大量的實踐,可以設(shè)計模式
以上六個階段,其中前三個階段是針對java的,但java中,在很多設(shè)計模式的應(yīng)用,同時有很多功能都支持設(shè)計模式,所以不懂設(shè)計模式的人是不會很好的應(yīng)用java做開發(fā)的。第4、5個階段的學(xué)習(xí)在前三個階段的基礎(chǔ)上,學(xué)習(xí)、應(yīng)用成功的經(jīng)驗。從而進(jìn)入第六個階段,在軟件設(shè)計這個領(lǐng)域盡情發(fā)揮。本人受能力所限,還處在第4個階段的學(xué)習(xí)過程,所以會對前四個階段說明。第五、六個階段只是我根據(jù)我自己的知識做的推斷,還沒有經(jīng)驗無法說明。
在對這些學(xué)習(xí)階段進(jìn)行闡述之前,我先說一下我的學(xué)習(xí)方法。在學(xué)習(xí)新的知識時我通常是按以下三個階段學(xué)的
- 理論學(xué)習(xí)。通過對理論的學(xué)習(xí),盡量了解新知識的概念;學(xué)習(xí)之后只是粗略的了解概念,不能和實際很好的結(jié)合。
- 演繹階段。根據(jù)理論學(xué)習(xí)的知識,考慮在什么場合下可以應(yīng)用這個新知識,哪些地方已經(jīng)應(yīng)用了這個概念,建立對新知識的感性認(rèn)識。
- 歸納階段。從一個更深的層次理解理論。
以下根據(jù)java的六個學(xué)習(xí)階段闡述我的體會,而每個階段將按照理論學(xué)習(xí)、演繹和歸納三個小階段討論。
語法學(xué)習(xí)的理論學(xué)習(xí)階段是最容易的階段,70%以上的java書主要介紹的就是java語法,隨意買來一本,通讀一下就可以,主要理解以下內(nèi)容:(1)數(shù)據(jù)類型,(2)操作符,(3)控制流程,(4)類和類再生,(5)包和接口,(6)異常操作。
在理論學(xué)習(xí)階段,不必過于注重細(xì)節(jié),只要對java的基本語法有一個整體認(rèn)識,能讀懂示例的源代碼就可以了。
下一步就是演繹階段,應(yīng)用所學(xué)的語法知識,編寫簡單的程序。最好憑自己的記憶,將各語法要點都用一遍(編寫代碼最好用notepad),對自己不熟悉的語法要重新閱讀,用編譯器去檢查語法錯誤。這個階段的目標(biāo)是脫離書本以及java API能編寫簡單的程序,閱讀一個java源代碼能說出執(zhí)行結(jié)果。
完成這個階段的學(xué)習(xí),參加scjp的考試,應(yīng)該獲得較高的成績。
在演繹階段的基礎(chǔ)上,根據(jù)自己犯過的錯誤,總結(jié)一下java的難點。重新閱讀語法書,將一些自己不是很清楚的概念重新整理一下,這時你對java語法的理解比第一次閱讀時更深了。
我在剛開始學(xué)java時,只是粗略的看看語法書,就開始編程序了,遇到不懂的就重新閱讀語法書,這樣,完全可以成為一個合格程序員,但是當(dāng)我成為team leader時,為了培訓(xùn)組員java編程,卻發(fā)現(xiàn)自己脫離了java語法書和Java API,竟然會的不多(java集成開發(fā)工具有提示功能),為了培訓(xùn),我又重新學(xué)了一遍java語法,很有收獲。
其實一個優(yōu)秀的程序員,不但要能寫出好的程序,更重要的是,對所寫的程序能說的清楚:(1)說清楚程序的功能(2)說清楚程序的結(jié)構(gòu)。而說清楚程序的結(jié)構(gòu)的基礎(chǔ)是對java的語法要熟悉。想成為優(yōu)秀的程序員,一定要在學(xué)習(xí)語法的基礎(chǔ)上,不斷實踐,不斷總結(jié),最終能脫離語法書,將java語法系統(tǒng)的講解清楚。
Java是面向?qū)ο蟮拈_發(fā)工具,使用java開發(fā)應(yīng)用時,一定要懂面向?qū)ο缶幊痰母拍睢T趯W(xué)過了java語法之后,應(yīng)該建立OOP的概念。
- 理論學(xué)習(xí)階段,首先應(yīng)當(dāng)理解class和object,了解class、interface、abstract class,理解OOP的繼承性,封裝性(public, protected,private)和多態(tài)性。然后應(yīng)當(dāng)熟悉UML,可以閱讀一些UML的簡單資料,基本上了解類圖、狀態(tài)圖和時序圖就可以了。
- 演繹階段,對OOP的實踐。而OOP的成功范例應(yīng)該是常見的23種設(shè)計模式。這個階段需要閱讀并體會設(shè)計模式UML圖和示例代碼,我推薦《java與模式》這本書,也可以訪問http://www.jdon.com/designpatterns/index.htm 。不必讀懂模式,只需要讀懂每個模式的UML和代碼。
- 歸納階段,通過演繹階段的學(xué)習(xí),體會OOP帶來的好處——對擴(kuò)展開放,對修改關(guān)閉。同時學(xué)會如何在java中使用OOP的概念設(shè)計。
我在使用Java編程初期,一直使用面向過程的思想編程,對class、interface、abstract class以及public、protect、private的存在并沒有理解,直到我閱讀了Gof的設(shè)計模式,才理解OOP的優(yōu)點。但是Gof的設(shè)計模式太晦澀了,我第一次讀時,僅僅是有了面向?qū)ο蟮母拍睿鴮υO(shè)計模式并沒有理解。相反《java與模式》容易讀一些,但《java與模式》一書的廢話多一些,有很多內(nèi)容可以不讀。
曾經(jīng)面試過一些java程序員,我出的題目是在使用java時,經(jīng)常用到哪些類,在哪個包里。很少有人能答好,甚至有人做了2年java程序都沒有回答出,他們會用java,但必須依賴工具(指java集成開工具),我覺得他們可以編寫出程序,但不能編寫出特別好得程序。
我認(rèn)為作為java程序員必須掌握java類庫的兩個包:java.lang和java.util這兩個包。java.lang包提供的是java編程要用到的基本類包,java程序員天天在用,無非是看別人如何用,自己就如何用,但很少有人去總結(jié)一下,比如String 和StringBuffer這兩個類有什么差別,應(yīng)該有很多java程序員說不出來。另外Vector和HashMap這兩個類大家都在用,有多少人能說清楚Vector和HashMap繼承了哪些類,實現(xiàn)了哪些接口呢。
- 理論學(xué)習(xí)。認(rèn)真閱讀java API的以下內(nèi)容:java.lang包中的String,StringBuffer,Number,Double,F(xiàn)loat,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類和接口。主要理清楚這些類或接口的繼承關(guān)系、主要功能。
- 演繹階段。通過閱讀代碼,練習(xí)編程,學(xué)習(xí)并應(yīng)用這些類和接口。其實這些類的大部分是經(jīng)常用的,無非對這些類和接口說不清楚。在這些類中,對java.lang和java.util包中的類,最好將各個方法練習(xí)使用一次。而對java.util包中Collections framework中的類,最好理清楚各個類和接口之間的關(guān)系。常用的類的方法我就不具體介紹了,我舉一個使用Observer和Obserable 的例子(摘自《The Complete Reference Java 2 》)。在Observer和Obserable中,java實現(xiàn)了對設(shè)計模式Observer的支持。
Watcher.java代碼
import java.util.*;
class Watcher implements Observer
{
public void update(Observable obj, Object arg )
{
System.out.println("Update() called, count is " +
((Integer) arg).intValue());
}
}
BeingWatched.java代碼
import java.util.*;
class BeingWatched extends Observable
{
void counter( int period )
{
for(;period >=0; period-- )
{
setChanged();
notifyObservers( new Integer ( period ) );
try
{
Thread.sleep(100);
}
catch( InterruptedException e)
{
System.out.println("Sleep interrupeted" );
}
}
}
};
ObserverDemo.java代碼
public class ObserverDemo
{
public static void main( String[] args )
{
BeingWatched observed = new BeingWatched();
Watcher observing = new Watcher();
observed.addObserver( observing);
observed.counter(10);
}
};
執(zhí)行結(jié)果
Update() called, count is 10
Update() called, count is 9
Update() called, count is 8
Update() called, count is 7
Update() called, count is 6
Update() called, count is 5
Update() called, count is 4
Update() called, count is 3
Update() called, count is 2
Update() called, count is 1
Update() called, count is 0
-
歸納階段。總結(jié)使用經(jīng)驗,體會這兩個包中類的繼承關(guān)系,對設(shè)計模式的支持(如Iterator本身就是設(shè)計模式,同時也是工廠方法模式的應(yīng)用),了解這些類提供的所有功能,比較功能相近類的異同。將這些類的api記在心中。
雖然集成開發(fā)環(huán)境支持方法提示功能,但我個人認(rèn)為,對于java.lang和java.util這兩個包的api應(yīng)當(dāng)熟記于心,java的其他類庫在使用時可以查找api。當(dāng)然如果從事不同的開發(fā),對其他類庫應(yīng)當(dāng)有相應(yīng)的了解,如開發(fā)swing,就應(yīng)當(dāng)對javax.swing包了如執(zhí)掌,開發(fā)b/s結(jié)構(gòu)的程序,就要了解javax.servlet,依個人的應(yīng)用來開發(fā)了。