Java 學習經驗

來源:互聯網
上載者:User
給學習 Java 的朋友們分享一些經驗

想來學習Java也有兩個年頭了,永遠不敢說多麼精通,但也想談談自己的感受,寫給軟體學院的同仁們,協助大家在技術的道路上少一點彎路。說得偉大一點是希望大家為軟體學院爭氣,其實最主要的還是大家自身的進步提升。

1. 關於動態載入機制——
學習Java比C++更容易理解OOP的思想,畢竟C++還混合了不少面向過程的成分。很多人都能背出來Java語言的特點,所謂的動態載入機制等等。當 然概念往往是先記住而後消化的,可有多少人真正去體會過動態載入的機制,試圖去尋找過其中的細節呢? 提供大家一個方法:
在命令列視窗運行Java程式的時候,加上這個很有用的參數:

java –verbose *.class

這樣會清晰的列印出被載入的類檔案,大部分是jdk自身運行需要的,最後幾行會明顯的看到自己用到的那幾個類檔案被載入進來的順序。即使你聲明了一個類對 象,不執行個體化也不會載入,說明只有真正用到那個類的執行個體即對象的時候,才會執行載入。這樣是不是大家稍微能明白一點動態載入了呢?^_^

2. 關於尋找class檔案原理——
建議大家在入門的時候在命令列視窗編譯和運行,不要藉助JCreator或者Eclipse等IDE去協助做那些事情。嘗試自己這樣做:
javac -classpath yourpath *.java
java -classpath yourpath *.class
也許很多人都能看懂,設定classpath的目的就是告訴編譯器去哪裡尋找你的class檔案. 不過至少筆者今日才弄懂JVM去查詢類的原理,編譯器載入類要依靠classloader, 而classloader有3個層級,從高到低分別是BootClassLoader(名字可能不準確) , ExtClassLoader, AppClassLoader.

這3個載入器分別對應著編譯器去尋找類檔案的優先順序別和不同的路徑:BootClassLoader對應jre/classes路徑,是編譯器最優先尋找class的地方
ExtClassLoader對應jre/lib/ext路徑,是編譯器次優先尋找class的地方
AppClassLoader對應當前路徑,所以也是編譯器預設找class的地方

其實大家可以自己寫個程式簡單的測試,對任何class,例如A,
調用new A().getClass().getClassLoader().toString() 列印出來就可以看到,把class檔案放在不同的路徑下再次執行,就會看到區別。特別注意的是如果列印出來是null就表示到了最進階 BootClassLoader, 因為它是C++編寫的,不存在Java對應的類載入器的名字。

尋找的順序是一種向上迂迴的思想,即如果本層級找不到,就只能去本層級之上的找,不會向下尋找。不過似乎從Jdk1.4到Jdk1.6這一特點又有改變, 沒有找到詳細資料。所以就不舉例子了。告訴大家設計這種體系的是Sun公司曾經的技術核心宮力先生,一個純種華人哦!^_^

這樣希望大家不至於迷惑為什麼總報錯找不到類檔案,不管是自己寫的還是匯入的第三方的jar檔案(J2ee中經常需要匯入的)。

3. 關於jdk和jre——
大家肯定在安裝JDK的時候會有選擇是否安裝單獨的jre,一般都會一起安裝,我也建議大家這樣做。因為這樣更能協助大家弄清楚它們的區別:

Jre 是java runtime environment, 是java程式的運行環境。既然是運行,當然要包含jvm,也就是大家熟悉的虛擬機器啦, 還有所有java類庫的class檔案,都在lib目錄下打包成了jar。大家可以自己驗證。至於在windows上的虛擬機器是哪個檔案呢? 學過MFC的都知道什麼是dll檔案吧,那麼大家看看jre/bin/client裡面是不是有一個jvm.dll呢?那就是虛擬機器。

Jdk 是java development kit,是java的開發套件,裡麵包含了各種類庫和工具。當然也包括了另外一個Jre. 那麼為什麼要包括另外一個Jre呢?而且jdk/jre/bin同時有client和server兩個檔案夾下都包含一個jvm.dll。 說明是有兩個虛擬機器的。這一點不知道大家是否注意到了呢?

相信大家都知道jdk的bin下有各種java程式需要用到的命令,與jre的bin目錄最明顯的區別就是jdk下才有javac,這一點很好理解,因為 jre只是一個運行環境而已。與開發無關,正因為如此,具備開發功能的jdk自己的jre下才會同時有client性質的jvm和server性質的 jvm, 而僅僅作為運行環境的jre下只需要client性質的jvm.dll就夠了。

記得在環境變數path中設定jdk/bin路徑麽?這應該是大家學習Java的第一步吧, 老師會告訴大家不設定的話javac和java是用不了的。確實jdk/bin目錄下包含了所有的命令。可是有沒有人想過我們用的java命令並不是 jdk/bin目錄下的而是jre/bin目錄下的呢?不信可以做一個實驗,大家可以把jdk/bin目錄下的java.exe剪下到別的地方再運行 java程式,發現了什嗎?一切OK!

那麼有人會問了?我明明沒有設定jre/bin目錄到環境變數中啊?

試想一下如果java為了提供給大多數人使用,他們是不需要jdk做開發的,只需要jre能讓java程式跑起來就可以了,那麼每個客戶還需要手動去設定 環境變數多麻煩啊?所以安裝jre的時候安裝程式自動幫你把jre的java.exe添加到了系統變數中,驗證的方法很簡單,大家看到了系統內容變數的 path最前面有“%SystemRoot%"system32;%SystemRoot%;”這樣的配置,那麼再去Windows/system32下 面去看看吧,發現了什嗎?有一個java.exe。

如果強行能夠把jdk/bin挪到system32變數前面,當然也可以迫使使用jdk/jre裡面的java,不過除非有必要,我不建議大家這麼做。使用單獨的jre跑java程式也算是客戶環境下的一種測試。

這下大家應該更清楚jdk和jre內部的一些聯絡和區別了吧?

PS: 其實還有滿多感想可以總結的,一次寫多了怕大家扔磚頭砸死我,怪我太羅唆。大家應該更加踏實更加務實的去做一些研究並互相分享心得,大方向和太前沿的技術討論是必要的但最好不要太多,畢竟自己基礎都還沒打好,什麼都講最新版本其實是進步的一大障礙!

書籍篇

學習一門新的知識,不可能指望只看一本,或者兩本書就能夠完全掌握。需要有一個循序漸進的閱讀過程。我推薦Oreilly出版的Java系列書籍。

在這裡我只想補充一點看法,很多人學習Java是從《Thinking in Java》這本書入手的,但是我認為這本書是不適合初學者的。我認為正確的使用這本書的方法應該是作為輔助的讀物。《Thinking in Java》並不是在完整的介紹Java的整個體系,而是一種跳躍式的寫作方法,是一種類似tips的方法來對Java很多知識點進行了深入的分析和解釋。

對於初學者來說,最好是找一本Java入門的書籍,但是比較完整的循序的介紹Java的文法,物件導向的特性,核心類庫等等,在看這本書的同時,可以同步來看《Thinking in Java》,來加深對Java的理解和原理的運用,同時又可以完整的瞭解Java的整個體系。

對於Java的入門書籍,蔡學鏞推薦的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition(針對C++背景)》,我並沒有看過這兩本書。其實我覺得電子工業出版社的《Java 2編程詳解》或者《Java 2從入門到精通》就很不錯。

在所有的Java書籍當中,其實最最有用的,並不是O'reilly的 Java Serials,真正最最有用處是JDK的 Documentation!幾乎你想獲得的所有的知識在Documentation裡面全部都有,其中最主要的部分當然是Java基礎類庫的API文檔,是按照package來組織的,對於每一個class都有詳細的解釋,它的繼承關係,是否實現了某個介面,通常用在哪些場合,還可以查到它所有的 public的屬性和方法,每個屬性的解釋,意義,每個方法的用途,調用的參數,參數的意義,傳回值的類型,以及方法可能拋出的異常等等。

可以這樣來說,所有關於Java編程方面的書籍其實都不過是在用比較通俗易懂的語言,和良好的組織方式來介紹Documentation裡面的某個 package裡麵包含的一些類的用法而已。所以萬變不離其宗,如果你有足夠的能力來直接通過Documentation來學習Java的類庫,那麼基本上就不需要看其他的書籍了。除此之外,Documentation也是編程必備的手冊,我的案頭上有三個Documentation的捷徑,分別是 J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的 Documentation。有了這個三個Documentation,什麼其他的書籍都不需要了。

對於Java Web 編程來說,最核心的是要熟悉和掌握HTTP協議,這個就和Java無關了,在熟悉HTTP協議之後,就需要熟悉Java的實現 HTTP協議的類庫,也就是Servlet API,所以最重要的東西就是Servlet API。當然對於初學者而言,直接通過Servlet API 來學習Web編程有很大的難度,我推薦O'reilly的《Java Server Pages 》這本書來學習Web 編程。

EJB的書籍當中,《Enterprise JavaBeans, 2nd Edition》是一本很不錯的書, EJB的學習門檻是比較高,入門很難,但是這本書完全降低了學習的難度,特別重要的一點是,EJB的學習需要結合一種App Server的具體實現,所以在學習EJB的同時,必須同步的學習某種App Server,而這本書相關的出了三本書,分別是Weblogic6.1,Websphere4.0和JBoss3.0上面部署書中例子的實做。真是既有理論,又有實踐。在學習EJB的同時,可以邊看邊做,EJB的學習會變得很輕鬆。

但是這本書也有一個問題,就是版本比較舊,主要講EJB1.1規範和部分EJB2.0的規範。而Ed Roman寫的《Mastering EJB 2.0》這本書完全是根據EJB2.0規範寫的,深入淺出,覆蓋了EJB編程的各個方面,並且還有很多編程經驗tips,也是學習EJB非常推薦的書籍之一。

如果是結合Weblogic來學習J2EE的話,《J2EE應用與BEA Weblogic Server》絕對是首選讀物,雖然是講述的 Weblogic6.0,仍然值得購買,這本書是BEA官方推薦的教材,作者也是BEA公司的工程師。現在中文版已經隨處可見了。這本書結合 Weblogic介紹了J2EE各個方面的技術在Weblogic平台上的開發和部署,實踐指導意義非常強。

在掌握了Java平台基礎知識和J2EE方面的知識以後,更進一步的是學習如何運用OO的方法進行軟體的設計,那麼就一定要學習“設計模式”。Sun公司出版了一本《J2EE核心模式》,是每個開發Java企業平台軟體的架構師必備的書籍。這本書全面的介紹了J2EE體系架構的各種設計模式,是設計師的必讀書籍。

過程篇

每個人的學習方法是不同的,一個人的方法不見得適合另一個人,我只能是談自己的學習方法。因為我學習Java是完全自學的,從來沒有問過別人,所以學習的過程基本上完全是自己摸索出來的。我也不知道這種方法是否是比較好的方法,只能給大家提供一點參考了。

學習Java的第一步,是安裝好JDK,寫一個Hello World,? 其實JDK的學習沒有那麼簡單,關於JDK有兩個問題是很容易一直困擾Java 程式員的地方:一個是CLASSPATH的問題,其實從原理上來說,是要搞清楚JRE的ClassLoader是如何載入Class的;另一個問題是 package和import問題,如何來尋找類的路徑問題。把這兩個問題摸索清楚了,就掃除了學習Java和使用JDK的最大障礙。推薦看一下王森的《Java深度曆險》,對這兩個問題進行了深入的探討。

第二步,是學習Java的文法。Java的文法是類C++的,基本上主流的程式設計語言不是類C,就是類C++的,沒有什麼新東西,所以文法的學習,大概就是半天的時間足夠了。唯一需要注意的是有幾個不容易搞清楚的關鍵字的用法,public,protected,private,static,什麼時候用,為什麼要用,怎麼用,這可能需要有人來指點一下,我當初是完全自己琢磨出來的,花了很久的時間。不過後來我看到《Thinking in Java》這本書上面是講了這些概念的。

第三步,是學習Java的物件導向的程式設計語言的特性的地方。比如繼承,構造器,抽象類別,介面,方法的多態,重載,覆蓋,Java的異常處理機制。對於一個沒有物件導向語言背景的人來說,我覺得這個過程需要花很長很長時間,因為學習Java之前沒有C++的經驗,只有C的經驗,我是大概花了一個月左右吧,才徹底把這些概念都搞清楚,把書上面的例子反覆的揣摩,修改,嘗試,把那幾章內容反覆的看過來,看過去,看了不下5遍,才徹底領悟了。不過我想如果有C++經驗的話,應該一兩天時間足夠了。那麼在這個過程中,可以多看看《Thinking in Java》這本書,對物件導向的講解非常透徹。可惜的是我學習的時候,並沒有看到這本書,所以自己花了大量的時間,通過自己的嘗試和揣摩來學會的。

第四步,就是開始熟悉Java的類庫。Java的基礎類庫其實就是JDK安裝目錄下面jre"lib"rt.jar這個包。學習基礎類庫就是學習rt.jar。基礎類庫裡面的類非常非常多。據說有3000多個,我沒有統計過。但是真正對於我們來說最核心的只有4個,分別是

java.lang.*;
java.io.*;
java.util.*;
java.sql.*;

這四個包的學習,每個包的學習都可以寫成一本厚厚的教材,而O'reilly也確實是這樣做的。我覺得如果時間比較緊,是不可能通過讀四本書來學習。我覺得比較好的學習方法是這樣的:

首先要通讀整個package的架構,瞭解整個package的class,interface,exception的構成,最好是能夠找到介紹整個包架構的文章。這些專門介紹包的書籍的前幾章應該就是這些總體的架構內容介紹。

對包整體架構的把握並不是要熟悉每個類的用法,記住它有哪些屬性,方法。想記也記不住的。而是要知道包有哪些方面的類構成的,這些類的用途是什麼,最核心的幾個類分別是完成什麼功能的。我在給人培訓的時候一般是一次課講一個包,所以不可能詳細的介紹每個類的用法,但是我反覆強調,我給你們講這些包的不是要告訴你們類的方法是怎麼調用的,也不要求你們記住類的方法調用,而是要你們瞭解,Java給我們提供了哪些類,每個類是用在什麼場合,當我遇到問題的時候,我知道哪個類,或者哪幾個類的組合可以解決我的問題,That'all!,當我們具體寫程式的時候,只要你知道該用哪個類來完成你的工作就足夠了。編碼的時候,具體的方法調用,是邊寫代碼,邊查Documentation,所有的東西都在Documentation裡面,不要求你一定記住,實際你也記不住3000多個類的總共將近10萬個方法調用。所以對每個包的總體架構的把握就變得極為重要。

第五步,通過上面的學習,如果學的比較紮實的話,就打好了Java的基礎了,剩下要做的工作是掃清Documentation裡面除了上面4個包之外的其他一些比較有用處的類。相信進展到這一步,Java的自學能力已經被培養出來了,可以到了直接學習Documentation的水平了。除了要做GUI編程之外,JDK裡面其他會有用處的包是這些:

java.text.*;
java.net.*;
javax.naming.*;

這些包裡面真正用的比較多的類其實很少,只有幾個,所以不需要花很多時間。

第六步,Java Web 編程

Web編程的核心是HTTP協議,HTTP協議和Java無關,如果不熟悉HTTP協議的話,雖然也可以學好Servlet/JSP編程,但是達不到舉一反三,一通百通的境界。所以HTTP協議的學習是必備的。如果熟悉了HTTP協議的話,又有了Java編程的良好的基礎,學習Servlet/JSP簡直易如反掌,我學習Servlet/JSP就用了不到一周的時間,然後就開始用JSP來做項目了。

在Servlet/JSP的學習中,重頭仍然是Servlet Documentation。Servlet API最常用的類很少,花比較少的時間就可以掌握了。把這些類都看一遍,多寫幾個例子試試。Servlet/JSP編程本質就是在反覆調用這些類來通過HTTP協議在Web Server和 Brower之間交談。另外對JSP,還需要熟悉幾個常用JSP的標記,具體的寫法記不住的話,臨時查就是了。

此外Java Web編程學習的重點要放在Web Application的設計模式上,如何進行商務邏輯的分析,並且進行合理的設計,按照MVC設計模式的要求,運用Servlet和JSP分別完成不同的邏輯層,掌握如何在Servlet和JSP之間進行流程的控制和資料的共用,以及 Web Application應該如何配置和部署。

第七步,J2EE編程

以上的學習過程如果是比較順利的話,進行到這一步,難度又陡然提高。因為上面的知識內容都是只涉及一個方面,而像EJB,JMS,JTA等核心的J2EE規範往往是幾種Java技術的綜合運用的結晶,所以掌握起來難度比較大。

首先一定要學習好JNDI,JNDI是App Server定位服務器資源(EJB組件,Datasouce,JMS)尋找方法,如果對JNDI不熟悉的話,EJB,JMS這些東西幾乎學不下去。JNDI其實就是javax.naming.*這個包,運用起來很簡單。痛點在於伺服器資源檔的配置。對於伺服器資源檔的配置,就需要看看專門的文檔規範了,比如web.xml的寫法,ejb-jar.xml的寫法等等。針對每種不同的App Server,還有自己的服務資源設定檔,也是需要熟悉的。

然後可以學習JTA,主要是要理解JTA對於事務的控制的方法,以及該在什麼場合使用JTA。這裡可以簡單的舉個例子,我們知道一般情況可以對於一個資料庫連接進行事務控制(conn.setAutoCommit(false),....,conn.commit()),做為一個原子操作,但是假設我的業務需求是要把對兩個不同資料庫的操作做為一個原子操作,你能做的到嗎?這時候只能用JTA了。假設操作過程是先往A資料庫插一條記錄,然後刪除B資料庫另一個記錄,我們自己寫代碼是控制不了把整個操作做為一個原子操作的。用JTA的話,由App Server來完成控制。

在學習EJB之前要學習對象序列化和RMI,RMI是EJB的基礎。接著學習JMS和EJB,對於EJB來說,最關鍵是要理解EJB是如何通過RMI來實現對遠端對象的調用的,以及在什麼情況下要用到EJB。

在學習完EJB,JMS這些東西之後,你可能會意識到要急不可待學習兩個領域的知識,一個是UML,另一個是Design Pattern。Java企業軟體的設計非常重視架構(Framework)的設計,一個好的軟體架構是軟體開發成功的必要條件。在這個時候,應該開始把學習的重點放在設計模式和架構的學習上,通過學習和實際的編程經驗來掌握EJB的設計模式和J2EE的核心模式。

J2EE規範裡面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外還有很多很多的企業技術,這裡不一一進行介紹了。

另外還有一個最新領域Web Services。Web Services也完全沒有任何新東西,它像是一種黏合劑,可以把不同的服務統一起來提供一個統一的調用介面,作為使用者來說,我只要獲得服務提供者給我的WSDL(對服務的描述),就夠了,我完全不知道伺服器提供者提供的服務究竟是EJB組件,還是.Net組件,還是什麼CORBA組件,還是其他的什麼實現,我也不需要知道。

Web Services最偉大的地方就在於通過統一的服務提供者式和調用方式,實現了整個Internet服務的共用,是一個非常令人激動的技術領域。Web Services好像目前還沒有什麼很好的書籍,但是可以通過在網路上面查資料的方式來學習。

方法篇

Java作為一門程式設計語言,最好的學習方法就是寫代碼。當你學習一個類以後,你就可以自己寫個簡單的例子程式來運行一下,看看有什麼結果,然後再多調用幾個類的方法,看看運行結果,這樣非常直觀的把類給學會了,而且記憶非常深刻。

然後不應該滿足把代碼調通,你應該想想看如果我不這樣寫,換個方式,再試試行不行。記得哪個高人說過學習編程就是個破壞的過程,把書上的例子,自己學習 Documentation編寫的例子在運行通過以後,不斷的嘗試著用不同的方法實現,不斷的嘗試破壞代碼的結構,看看它會有什麼結果。通過這樣的方式,你會很徹底的很精通的掌握Java。

舉個例子,我們都編過Hello World

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}

很多初學者不是很理解為什麼main方法一定要這樣來定義public static void main(String[] args),能不能不這樣寫?包括我剛學習Java的時候也有這樣的疑問。想知道答案嗎?很簡單,你把main改個名字運行一下,看看報什麼錯誤,然後根據出錯資訊進行分析;把 main的public取掉,在試試看,報什麼錯誤;static去掉還能不能運行;不知道main方法是否一定要傳一個String[]數組的,把 String[]改掉,改成int[],或者String試試看;不知道是否必須寫args參數名稱的,也可以把args改成別的名字,看看運行結果如何。
我當初學習Java的時候就是這樣做的,把Hello World程式反覆改了七八次,不斷運行,分析運行結果,最後就徹底明白為什麼了main方法是這樣定義的了。

此外,我對於staic,public,private,Exception,try{ }catch {}finally{}等等等等一開始都不是很懂,都是把參考書上面的例子運行成功,然後就開始破壞它,不斷的根據自己心裏面的疑問來重新改寫程式,看看能不能運行,運行出來是個什麼樣子,是否可以得到預期的結果。這樣雖然比較費時間,不過一個例子程式這樣反覆破壞幾次之後。我就對這個相關的知識徹底學通了。有時候甚至故意寫一些錯誤的代碼來運行,看看能否得到預期的運行錯誤。這樣對於編程的掌握是及其深刻的。

其中特別值得一提的是JDK有一個非常棒的調試功能,-verbose

java –verbose
javac –verbose 以及其它很多JDK工具都有這個選項
-verbose

可以顯示在命令執行的過程中,JVM都依次載入哪裡Class,通過這些寶貴的調試資訊,可以協助我們分析出JVM在執行的過程中都幹了些什麼。

另外,自己在學習過程中,寫的很多的這種破壞常式,應該有意識的分門別類的儲存下來,在工作中積累的典型常式也應該定期整理,日積月累,自己就有了一個程式碼程式庫了。遇到類似的問題,到程式碼程式庫裡面 Copy & Paste ,Search & Replace,就好了,極大提高了開發速度。最理想的情況是把一些通用的常式自己再抽象一層,形成一個通用的類庫,封裝好。那麼可複用性就更強了。

所以我覺得其實不是特別需要常式的,自己寫的破壞常式就是最好的例子,如果你實在對自己寫的代碼不放心的話,我強烈推薦你看看JDK基礎類庫的Java原始碼。在JDK安裝目錄下面會有一個src.zip,解開來就可以完整的看到整個JDK基礎類庫,也就是rt.jar的Java原始碼,你可以參考一下 Sun是怎麼寫Java程式的,規範是什麼樣子的。我自己在學習Java的類庫的時候,當有些地方理解的不是很清楚的時候,或者想更加清晰的理解運作的細節的時候,往往會開啟相應的類的原始碼,通過看原始碼,所有的問題都會一掃而空。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.