這個(gè)題目很有意思。不用這么復(fù)雜。大概10幾句就做完了。
10年積累的網(wǎng)站建設(shè)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有息烽免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
以前我用C#做過的。先把邏輯簡化了。幾個(gè)IF THEN就搞定
你才一個(gè)月,就沒耐心啦?
你這么說感覺你一點(diǎn)都比喜歡Java,學(xué)習(xí)Java只是為了一個(gè)功利的目標(biāo),這樣怎么能學(xué)好。希望你從培養(yǎng)興趣這塊入手。
我收集過一篇關(guān)于學(xué)習(xí)Java很不錯(cuò)的文章,如下。希望能幫到你。
[精華] Java學(xué)習(xí)從入門到精通
Java?Learning?Path?(一)、工具篇??
一、?JDK?(Java?Development?Kit)??
JDK是整個(gè)Java的核心,包括了Java運(yùn)行環(huán)境(Java?Runtime?Envirnment),一堆Java工具和Java基礎(chǔ)的類庫(rt.jar)。不論什么Java應(yīng)用服務(wù)器實(shí)質(zhì)都是內(nèi)置了某個(gè)版本的JDK。因此掌握J(rèn)DK是學(xué)好Java的第一步。最主流的JDK是Sun公司發(fā)布的JDK,除了Sun之外,還有很多公司和組織都開發(fā)了自己的JDK,例如IBM公司開發(fā)的JDK,BEA公司的Jrocket,還有GNU組織開發(fā)的JDK等等。其中IBM的JDK包含的JVM(Java?Virtual?Machine)運(yùn)行效率要比Sun?JDK包含的JVM高出許多。而專門運(yùn)行在x86平臺的Jrocket在服務(wù)端運(yùn)行效率也要比Sun?JDK好很多。但不管怎么說,我們還是需要先把Sun?JDK掌握好。??
1、?JDK的下載和安裝??
JDK又叫做J2SE(Java2?SDK?Standard?Edition),可以從Sun的Java網(wǎng)站上下載到,?,JDK當(dāng)前最新的版本是J2SDK1.4.2,建議下載該版本的JDK,下載頁面在這里:。??
下載好的JDK是一個(gè)可執(zhí)行安裝程序,默認(rèn)安裝完畢后會在C:\Program?Files\Java\目錄下安裝一套JRE(供瀏覽器來使用),在C:\j2sdk1.4.2下安裝一套JDK(也包括一套JRE)。然后我們需要在環(huán)境變量PATH的最前面增加java的路徑C:\j2sdk1.4.2\bin。這樣JDK就安裝好了。??
2、?JDK的命令工具??
JDK的最重要命令行工具:??
java:?啟動JVM執(zhí)行class??
javac:?Java編譯器??
jar:?Java打包工具??
javadoc:?Java文檔生成器??
這些命令行必須要非常非常熟悉,對于每個(gè)參數(shù)都要很精通才行。對于這些命令的學(xué)習(xí),JDK?Documentation上有詳細(xì)的文檔。??
二、?JDK?Documentation??
Documentation在JDK的下載頁面也有下載連接,建議同時(shí)下載Documentation。Documentation是最最重要的編程手冊,涵蓋了整個(gè)Java所有方面的內(nèi)容的描述??梢赃@樣說,學(xué)習(xí)Java編程,大部分時(shí)間都是花在看這個(gè)Documentation上面的。我是隨身攜帶的,寫Java代碼的時(shí)候,隨時(shí)查看,須臾不離手。??
Java?Learning?Path(二)、書籍篇??
學(xué)習(xí)一門新的知識,不可能指望只看一本,或者兩本書就能夠完全掌握。需要有一個(gè)循序漸進(jìn)的閱讀過程。我推薦Oreilly出版的Java系列書籍。??
在這里我只想補(bǔ)充一點(diǎn)看法,很多人學(xué)習(xí)Java是從《Thinking?in?Java》這本書入手的,但是我認(rèn)為這本書是不適合初學(xué)者的。我認(rèn)為正確的使用這本書的方法應(yīng)該是作為輔助的讀物?!禩hinking?in?Java》并不是在完整的介紹Java的整個(gè)體系,而是一種跳躍式的寫作方法,是一種類似tips的方法來對Java很多知識點(diǎn)進(jìn)行了深入的分析和解釋。??
對于初學(xué)者來說,最好是找一本Java入門的書籍,但是比較完整的循序的介紹Java的語法,面向?qū)ο蟮奶匦?,核心類庫等等,在看這本書的同時(shí),可以同步來看《Thinking?in?Java》,來加深對Java的理解和原理的運(yùn)用,同時(shí)又可以完整的了解Java的整個(gè)體系。??
對于Java的入門書籍,蔡學(xué)鏞推薦的是Oreilly的《Exploring?Java,?2nd?Edition》?或者《Java?in?a?Nutshell,2nd?Edition(針對C++背景)》,我并沒有看過這兩本書。其實(shí)我覺得電子工業(yè)出版社的《Java?2編程詳解》或者《Java?2從入門到精通》就很不錯(cuò)。??
在所有的Java書籍當(dāng)中,其實(shí)最最有用的,并不是O'reilly的?Java?Serials,真正最最有用處是JDK的Documentation!幾乎你想獲得的所有的知識在Documentation里面全部都有,其中最主要的部分當(dāng)然是Java基礎(chǔ)類庫的API文檔,是按照package來組織的,對于每一個(gè)class都有詳細(xì)的解釋,它的繼承關(guān)系,是否實(shí)現(xiàn)了某個(gè)接口,通常用在哪些場合,還可以查到它所有的public的屬性和方法,每個(gè)屬性的解釋,意義,每個(gè)方法的用途,調(diào)用的參數(shù),參數(shù)的意義,返回值的類型,以及方法可能拋出的異常等等??梢赃@樣來說,所有關(guān)于Java編程方面的書籍其實(shí)都不過是在用比較通俗易懂的語言,和良好的組織方式來介紹Documentation里面的某個(gè)package里面包含的一些類的用法而已。所以萬變不離其宗,如果你有足夠的能力來直接通過Documentation來學(xué)習(xí)Java的類庫,那么基本上就不需要看其他的書籍了。除此之外,Documentation也是編程必備的手冊,我的桌面上有三個(gè)Documentation的快捷方式,分別是J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了這個(gè)三個(gè)Documentation,什么其他的書籍都不需要了。??
對于Java?Web?編程來說,最核心的是要熟悉和掌握HTTP協(xié)議,這個(gè)就和Java無關(guān)了,在熟悉HTTP協(xié)議之后,就需要熟悉Java的實(shí)現(xiàn)HTTP協(xié)議的類庫,也就是Servlet?API,所以最重要的東西就是Servlet?API。當(dāng)然對于初學(xué)者而言,直接通過Servlet?API來學(xué)習(xí)Web編程有很大的難度,我推薦O'reilly的《Java?Server?Pages?》這本書來學(xué)習(xí)Web?編程。??
EJB的書籍當(dāng)中,《Enterprise?JavaBeans,?2nd?Edition》是一本很不錯(cuò)的書,?EJB的學(xué)習(xí)門檻是比較高,入門很難,但是這本書完全降低了學(xué)習(xí)的難度,特別重要的一點(diǎn)是,EJB的學(xué)習(xí)需要結(jié)合一種App?Server的具體實(shí)現(xiàn),所以在學(xué)習(xí)EJB的同時(shí),必須同步的學(xué)習(xí)某種App?Server,而這本書相關(guān)的出了三本書,分別是Weblogic6.1,Websphere4.0和JBoss3.0上面部署書中例子的實(shí)做。真是既有理論,又有實(shí)踐。在學(xué)習(xí)EJB的同時(shí),可以邊看邊做,EJB的學(xué)習(xí)會變得很輕松。??
但是這本書也有一個(gè)問題,就是版本比較舊,主要講EJB1.1規(guī)范和部分EJB2.0的規(guī)范。而Ed?Roman寫的《Mastering?EJB?2.0》這本書完全是根據(jù)EJB2.0規(guī)范寫的,深入淺出,覆蓋了EJB編程的各個(gè)方面,并且還有很多編程經(jīng)驗(yàn)tips,也是學(xué)習(xí)EJB非常推薦的書籍之一。??
如果是結(jié)合Weblogic來學(xué)習(xí)J2EE的話,《J2EE應(yīng)用與BEA?Weblogic?Server》絕對是首選讀物,雖然是講述的Weblogic6.0,仍然值得購買,這本書是BEA官方推薦的教材,作者也是BEA公司的工程師?,F(xiàn)在中文版已經(jīng)隨處可見了。這本書結(jié)合Weblogic介紹了J2EE各個(gè)方面的技術(shù)在Weblogic平臺上的開發(fā)和部署,實(shí)踐指導(dǎo)意義非常強(qiáng)。??
在掌握了Java平臺基礎(chǔ)知識和J2EE方面的知識以后,更進(jìn)一步的是學(xué)習(xí)如何運(yùn)用OO的方法進(jìn)行軟件的設(shè)計(jì),那么就一定要學(xué)習(xí)“設(shè)計(jì)模式”。Sun公司出版了一本《J2EE核心模式》,是每個(gè)開發(fā)Java企業(yè)平臺軟件的架構(gòu)師必備的書籍。這本書全面的介紹了J2EE體系架構(gòu)的各種設(shè)計(jì)模式,是設(shè)計(jì)師的必讀書籍。??
Java?Learning?Path(三)過程篇??
每個(gè)人的學(xué)習(xí)方法是不同的,一個(gè)人的方法不見得適合另一個(gè)人,我只能是談自己的學(xué)習(xí)方法。因?yàn)槲覍W(xué)習(xí)Java是完全自學(xué)的,從來沒有問過別人,所以學(xué)習(xí)的過程基本上完全是自己摸索出來的。我也不知道這種方法是否是比較好的方法,只能給大家提供一點(diǎn)參考了。??
學(xué)習(xí)Java的第一步是安裝好JDK,寫一個(gè)Hello?World,#61514;?其實(shí)JDK的學(xué)習(xí)沒有那么簡單,關(guān)于JDK有兩個(gè)問題是很容易一直困擾Java程序員的地方:一個(gè)是CLASSPATH的問題,其實(shí)從原理上來說,是要搞清楚JRE的ClassLoader是如何加載Class的;另一個(gè)問題是package和import問題,如何來尋找類的路徑問題。把這兩個(gè)問題摸索清楚了,就掃除了學(xué)習(xí)Java和使用JDK的最大障礙。推薦看一下王森的《Java深度歷險(xiǎn)》,對這兩個(gè)問題進(jìn)行了深入的探討。??
第二步是學(xué)習(xí)Java的語法。Java的語法是類C++的,基本上主流的編程語言不是類C,就是類C++的,沒有什么新東西,所以語法的學(xué)習(xí),大概就是半天的時(shí)間足夠了。唯一需要注意的是有幾個(gè)不容易搞清楚的關(guān)鍵字的用法,public,protected,private,static,什么時(shí)候用,為什么要用,怎么用,這可能需要有人來指點(diǎn)一下,我當(dāng)初是完全自己琢磨出來的,花了很久的時(shí)間。不過后來我看到《Thinking?in?Java》這本書上面是講了這些概念的。??
第三步是學(xué)習(xí)Java的面向?qū)ο蟮木幊陶Z言的特性的地方。比如繼承,構(gòu)造器,抽象類,接口,方法的多態(tài),重載,覆蓋,Java的異常處理機(jī)制。對于一個(gè)沒有面向?qū)ο笳Z言背景的人來說,我覺得這個(gè)過程需要花很長很長時(shí)間,因?yàn)閷W(xué)習(xí)Java之前沒有C++的經(jīng)驗(yàn),只有C的經(jīng)驗(yàn),我是大概花了一個(gè)月左右吧,才徹底把這些概念都搞清楚,把書上面的例子反復(fù)的揣摩,修改,嘗試,把那幾章內(nèi)容反復(fù)的看過來,看過去,看了不下5遍,才徹底領(lǐng)悟了。不過我想如果有C++經(jīng)驗(yàn)的話,應(yīng)該一兩天時(shí)間足夠了。那么在這個(gè)過程中,可以多看看《Thinking?in?Java》這本書,對面向?qū)ο蟮闹v解非常透徹??上У氖俏覍W(xué)習(xí)的時(shí)候,并沒有看到這本書,所以自己花了大量的時(shí)間,通過自己的嘗試和揣摩來學(xué)會的。??
第四步就是開始熟悉Java的類庫。Java的基礎(chǔ)類庫其實(shí)就是JDK安裝目錄下面jre\lib\rt.jar這個(gè)包。學(xué)習(xí)基礎(chǔ)類庫就是學(xué)習(xí)rt.jar?;A(chǔ)類庫里面的類非常非常多。據(jù)說有3000多個(gè),我沒有統(tǒng)計(jì)過。但是真正對于我們來說最核心的只有4個(gè),分別是?
java.lang.*;??
java.io.*;??
java.util.*;??
java.sql.*;??
這四個(gè)包的學(xué)習(xí),每個(gè)包的學(xué)習(xí)都可以寫成一本厚厚的教材,而O'reilly也確實(shí)是這樣做的。我覺得如果時(shí)間比較緊,是不可能通過讀四本書來學(xué)習(xí)。我覺得比較好的學(xué)習(xí)方法是這樣的:??
首先要通讀整個(gè)package的框架,了解整個(gè)package的class,interface,exception的構(gòu)成,最好是能夠找到介紹整個(gè)包框架的文章。這些專門介紹包的書籍的前幾章應(yīng)該就是這些總體的框架內(nèi)容介紹。??
對包整體框架的把握并不是要熟悉每個(gè)類的用法,記住它有哪些屬性,方法。想記也記不住的。而是要知道包有哪些方面的類構(gòu)成的,這些類的用途是什么,最核心的幾個(gè)類分別是完成什么功能的。我在給人培訓(xùn)的時(shí)候一般是一次課講一個(gè)包,所以不可能詳細(xì)的介紹每個(gè)類的用法,但是我反復(fù)強(qiáng)調(diào),我給你們講這些包的不是要告訴你們類的方法是怎么調(diào)用的,也不要求你們記住類的方法調(diào)用,而是要你們了解,Java給我們提供了哪些類,每個(gè)類是用在什么場合,當(dāng)我遇到問題的時(shí)候,我知道哪個(gè)類,或者哪幾個(gè)類的組合可以解決我的問題,That'all!,當(dāng)我們具體寫程序的時(shí)候,只要你知道該用哪個(gè)類來完成你的工作就足夠了。編碼的時(shí)候,具體的方法調(diào)用,是邊寫代碼,邊查Documentation,所有的東西都在Documentation里面,不要求你一定記住,實(shí)際你也記不住3000多個(gè)類的總共將近10萬個(gè)方法調(diào)用。所以對每個(gè)包的總體框架的把握就變得極為重要。??
第五步,通過上面的學(xué)習(xí),如果學(xué)的比較扎實(shí)的話,就打好了Java的基礎(chǔ)了,剩下要做的工作是掃清Documentation里面除了上面4個(gè)包之外的其他一些比較有用處的類。相信進(jìn)展到這一步,Java的自學(xué)能力已經(jīng)被培養(yǎng)出來了,可以到了直接學(xué)習(xí)Documentation的水平了。除了要做GUI編程之外,JDK里面其他會有用處的包是這些:??
java.text.*;??
java.net.*;??
javax.naming.*;??
這些包里面真正用的比較多的類其實(shí)很少,只有幾個(gè),所以不需要花很多時(shí)間。??
第六步,Java?Web?編程??
Web編程的核心是HTTP協(xié)議,HTTP協(xié)議和Java無關(guān),如果不熟悉HTTP協(xié)議的話,雖然也可以學(xué)好Servlet/JSP編程,但是達(dá)不到舉一反三,一通百通的境界。所以HTTP協(xié)議的學(xué)習(xí)是必備的。如果熟悉了HTTP協(xié)議的話,又有了Java編程的良好的基礎(chǔ),學(xué)習(xí)Servlet/JSP簡直易如反掌,我學(xué)習(xí)Servlet/JSP就用了不到一周的時(shí)間,然后就開始用JSP來做項(xiàng)目了。??
在Servlet/JSP的學(xué)習(xí)中,重頭仍然是Servlet?Documentation。Servlet?API最常用的類很少,花比較少的時(shí)間就可以掌握了。把這些類都看一遍,多寫幾個(gè)例子試試。Servlet/JSP編程本質(zhì)就是在反復(fù)調(diào)用這些類來通過HTTP協(xié)議在Web?Server和Brower之間交談。另外對JSP,還需要熟悉幾個(gè)常用JSP的標(biāo)記,具體的寫法記不住的話,臨時(shí)查就是了。??
此外Java?Web編程學(xué)習(xí)的重點(diǎn)要放在Web?Application的設(shè)計(jì)模式上,如何進(jìn)行業(yè)務(wù)邏輯的分析,并且進(jìn)行合理的設(shè)計(jì),按照MVC設(shè)計(jì)模式的要求,運(yùn)用Servlet和JSP分別完成不同的邏輯層,掌握如何在Servlet和JSP之間進(jìn)行流程的控制和數(shù)據(jù)的共享,以及Web?Application應(yīng)該如何配置和部署。??
第七步,J2EE編程??
以上的學(xué)習(xí)過程如果是比較順利的話,進(jìn)行到這一步,難度又陡然提高。因?yàn)樯厦娴闹R內(nèi)容都是只涉及一個(gè)方面,而像EJB,JMS,JTA等核心的J2EE規(guī)范往往是幾種Java技術(shù)的綜合運(yùn)用的結(jié)晶,所以掌握起來難度比較大。??
首先一定要學(xué)習(xí)好JNDI,JNDI是App?Server定位服務(wù)器資源(EJB組件,Datasouce,JMS)查找方法,如果對JNDI不熟悉的話,EJB,JMS這些東西幾乎學(xué)不下去。JNDI其實(shí)就是javax.naming.*這個(gè)包,運(yùn)用起來很簡單。難點(diǎn)在于服務(wù)器資源文件的配置。對于服務(wù)器資源文件的配置,就需要看看專門的文檔規(guī)范了,比如web.xml的寫法,ejb-jar.xml的寫法等等。針對每種不同的App?Server,還有自己的服務(wù)資源配置文件,也是需要熟悉的。??
然后可以學(xué)習(xí)JTA,主要是要理解JTA對于事務(wù)的控制的方法,以及該在什么場合使用JTA。這里可以簡單的舉個(gè)例子,我們知道一般情況可以對于一個(gè)數(shù)據(jù)庫連接進(jìn)行事務(wù)控制(conn.setAutoCommit(false),....,conn.commit()),做為一個(gè)原子操作,但是假設(shè)我的業(yè)務(wù)需求是要把對兩個(gè)不同數(shù)據(jù)庫的操作做為一個(gè)原子操作,你能做的到嗎?這時(shí)候只能用JTA了。假設(shè)操作過程是先往A數(shù)據(jù)庫插一條記錄,然后刪除B數(shù)據(jù)庫另一個(gè)記錄,我們自己寫代碼是控制不了把整個(gè)操作做為一個(gè)原子操作的。用JTA的話,由App?Server來完成控制。??
在學(xué)習(xí)EJB之前要學(xué)習(xí)對象序列化和RMI,RMI是EJB的基礎(chǔ)。接著學(xué)習(xí)JMS和EJB,對于EJB來說,最關(guān)鍵是要理解EJB是如何通過RMI來實(shí)現(xiàn)對遠(yuǎn)端對象的調(diào)用的,以及在什么情況下要用到EJB。??
在學(xué)習(xí)完EJB,JMS這些東西之后,你可能會意識到要急不可待學(xué)習(xí)兩個(gè)領(lǐng)域的知識,一個(gè)是UML,另一個(gè)是Design?Pattern。Java企業(yè)軟件的設(shè)計(jì)非常重視框架(Framework)的設(shè)計(jì),一個(gè)好的軟件框架是軟件開發(fā)成功的必要條件。在這個(gè)時(shí)候,應(yīng)該開始把學(xué)習(xí)的重點(diǎn)放在設(shè)計(jì)模式和框架的學(xué)習(xí)上,通過學(xué)習(xí)和實(shí)際的編程經(jīng)驗(yàn)來掌握EJB的設(shè)計(jì)模式和J2EE的核心模式。??
J2EE規(guī)范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外還有很多很多的企業(yè)技術(shù),這里不一一進(jìn)行介紹了。??
另外還有一個(gè)最新領(lǐng)域Web?Services。Web?Services也完全沒有任何新東西,它像是一種黏合劑,可以把不同的服務(wù)統(tǒng)一起來提供一個(gè)統(tǒng)一的調(diào)用接口,作為使用者來說,我只要獲得服務(wù)提供者給我的WSDL(對服務(wù)的描述),就夠了,我完全不知道服務(wù)器提供者提供的服務(wù)究竟是EJB組件,還是.Net組件,還是什么CORBA組件,還是其他的什么實(shí)現(xiàn),我也不需要知道。Web?Services最偉大的地方就在于通過統(tǒng)一的服務(wù)提供方式和調(diào)用方式,實(shí)現(xiàn)了整個(gè)Internet服務(wù)的共享,是一個(gè)非常令人激動的技術(shù)領(lǐng)域。Web?Services好像目前還沒有什么很好的書籍,但是可以通過在網(wǎng)絡(luò)上面查資料的方式來學(xué)習(xí)。??
Java?Learning?Path(四)?方法篇??
Java作為一門編程語言,最好的學(xué)習(xí)方法就是寫代碼。當(dāng)你學(xué)習(xí)一個(gè)類以后,你就可以自己寫個(gè)簡單的例子程序來運(yùn)行一下,看看有什么結(jié)果,然后再多調(diào)用幾個(gè)類的方法,看看運(yùn)行結(jié)果,這樣非常直觀的把類給學(xué)會了,而且記憶非常深刻。然后不應(yīng)該滿足把代碼調(diào)通,你應(yīng)該想想看如果我不這樣寫,換個(gè)方式,再試試行不行。記得哪個(gè)高人說過學(xué)習(xí)編程就是個(gè)破壞的過程,把書上的例子,自己學(xué)習(xí)Documentation編寫的例子在運(yùn)行通過以后,不斷的嘗試著用不同的方法實(shí)現(xiàn),不斷的嘗試破壞代碼的結(jié)構(gòu),看看它會有什么結(jié)果。通過這樣的方式,你會很徹底的很精通的掌握J(rèn)ava。??
舉個(gè)例子,我們都編過Hello?World??
public?class?HelloWorld?{??
public?static?void?main(String[]?args)?{??
System.out.println("Hello?World");??
}??
}??
很多初學(xué)者不是很理解為什么main方法一定要這樣來定義public?static?void?main(String[]?args),能不能不這樣寫?包括我剛學(xué)習(xí)Java的時(shí)候也有這樣的疑問。想知道答案嗎?很簡單,你把main改個(gè)名字運(yùn)行一下,看看報(bào)什么錯(cuò)誤,然后根據(jù)出錯(cuò)信息進(jìn)行分析;把main的public取掉,在試試看,報(bào)什么錯(cuò)誤;static去掉還能不能運(yùn)行;不知道m(xù)ain方法是否一定要傳一個(gè)String[]數(shù)組的,把String[]改掉,改成int[],或者String試試看;不知道是否必須寫args參數(shù)名稱的,也可以把a(bǔ)rgs改成別的名字,看看運(yùn)行結(jié)果如何。??
我當(dāng)初學(xué)習(xí)Java的時(shí)候就是這樣做的,把Hello?World程序反復(fù)改了七八次,不斷運(yùn)行,分析運(yùn)行結(jié)果,最后就徹底明白為什么了main方法是這樣定義的了。??
此外,我對于staic,public,private,Exception,try{?}catch?{}finally{}等等等等一開始都不是很懂,都是把參考書上面的例子運(yùn)行成功,然后就開始破壞它,不斷的根據(jù)自己心里面的疑問來重新改寫程序,看看能不能運(yùn)行,運(yùn)行出來是個(gè)什么樣子,是否可以得到預(yù)期的結(jié)果。這樣雖然比較費(fèi)時(shí)間,不過一個(gè)例子程序這樣反復(fù)破壞幾次之后。我就對這個(gè)相關(guān)的知識徹底學(xué)通了。有時(shí)候甚至故意寫一些錯(cuò)誤的代碼來運(yùn)行,看看能否得到預(yù)期的運(yùn)行錯(cuò)誤。這樣對于編程的掌握是及其深刻的。??
其中特別值得一提的是JDK有一個(gè)非常棒的調(diào)試功能,-verbose??
java?–verbose??
javac?–verbose?以及其它很多JDK工具都有這個(gè)選項(xiàng)??
-verbose?可以顯示在命令執(zhí)行的過程中,JVM都依次加載哪里Class,通過這些寶貴的調(diào)試信息,可以幫助我們分析出JVM在執(zhí)行的過程中都干了些什么。??
另外,自己在學(xué)習(xí)過程中,寫的很多的這種破壞例程,應(yīng)該有意識的分門別類的保存下來,在工作中積累的典型例程也應(yīng)該定期整理,日積月累,自己就有了一個(gè)代碼庫了。遇到類似的問題,到代碼庫里面?Copy??Paste?,Search??Replace,就好了,極大提高了開發(fā)速度。最理想的情況是把一些通用的例程自己再抽象一層,形成一個(gè)通用的類庫,封裝好。那么可復(fù)用性就更強(qiáng)了。??
所以我覺得其實(shí)不是特別需要例程的,自己寫的破壞例程就是最好的例子,如果你實(shí)在對自己寫的代碼不放心的話,我強(qiáng)烈推薦你看看JDK基礎(chǔ)類庫的Java源代碼。在JDK安裝目錄下面會有一個(gè)src.zip,解開來就可以完整的看到整個(gè)JDK基礎(chǔ)類庫,也就是rt.jar的Java源代碼,你可以參考一下Sun是怎么寫Java程序的,規(guī)范是什么樣子的。我自己在學(xué)習(xí)Java的類庫的時(shí)候,當(dāng)有些地方理解的不是很清楚的時(shí)候,或者想更加清晰的理解運(yùn)作的細(xì)節(jié)的時(shí)候,往往會打開相應(yīng)的類的源代碼,通過看源代碼,所有的問題都會一掃而空。??
位邏輯運(yùn)算符有“與”(AND)、“或”(OR)、“異或(XOR)”、“非(NOT)”,分別用“”、“|”、“^”、“~”表示。
下面的例子說明了位邏輯運(yùn)算符:
// Demonstrate the bitwise logical operators.
class BitLogic {
public static void main(String args[]) {
String binary[] = {
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
};
int a = 3; // 0 + 2 + 1 or 0011 in binary
int b = 6; // 4 + 2 + 0 or 0110 in binary
int c = a | b;
int d = a b;
int e = a ^ b;
int f = (~a b) | (a ~b);
int g = ~a 0x0f;
System.out.println(" a = " + binary[a]);
System.out.println(" b = " + binary[b]);
System.out.println(" a|b = " + binary[c]);
System.out.println(" ab = " + binary[d]);
System.out.println(" a^b = " + binary[e]);
System.out.println("~ab|a~b = " + binary[f]);
System.out.println(" ~a = " + binary[g]);
}
}
在本例中,變量a與b對應(yīng)位的組合代表了二進(jìn)制數(shù)所有的 4 種組合模式:0-0,0-1,1-0,和1-1?!皘”運(yùn)算符和“”運(yùn)算符分別對變量a與b各個(gè)對應(yīng)位的運(yùn)算得到了變量c和變量d的值。對變量e和f的賦值說明了“^”運(yùn)算符的功能。字符串?dāng)?shù)組binary代表了0到15對應(yīng)的二進(jìn)制的值。在本例中,數(shù)組各元素的排列順序顯示了變量對應(yīng)值的二進(jìn)制代碼。數(shù)組之所以這樣構(gòu)造是因?yàn)樽兞康闹祅對應(yīng)的二進(jìn)制代碼可以被正確的存儲在數(shù)組對應(yīng)元素binary[n]中。例如變量a的值為3,則它的二進(jìn)制代碼對應(yīng)地存儲在數(shù)組元素binary[3]中。~a的值與數(shù)字0x0f (對應(yīng)二進(jìn)制為0000 1111)進(jìn)行按位與運(yùn)算的目的是減小~a的值,保證變量g的結(jié)果小于16。因此該程序的運(yùn)行結(jié)果可以用數(shù)組binary對應(yīng)的元素來表示。該程序的輸出如下:
a = 0011
b = 0110
a|b = 0111
ab = 0010
a^b = 0101
~ab|a~b = 0101
~a = 1100
左移運(yùn)算符
左移運(yùn)算符使指定值的所有位都左移規(guī)定的次數(shù)。它的通用格式如下所示:
value num
這里,num指定要移位值value移動的位數(shù)。也就是,左移運(yùn)算符使指定值的所有位都左移num位。每左移一個(gè)位,高階位都被移出(并且丟棄),并用0填充右邊。這意味著當(dāng)左移的運(yùn)算數(shù)是int類型時(shí),每移動1位它的第31位就要被移出并且丟棄;當(dāng)左移的運(yùn)算數(shù)是long類型時(shí),每移動1位它的第63位就要被移出并且丟棄。
在對byte和short類型的值進(jìn)行移位運(yùn)算時(shí),你必須小心。因?yàn)槟阒繨ava在對表達(dá)式求值時(shí),將自動把這些類型擴(kuò)大為 int型,而且,表達(dá)式的值也是int型 。對byte和short類型的值進(jìn)行移位運(yùn)算的結(jié)果是int型,而且如果左移不超過31位,原來對應(yīng)各位的值也不會丟棄。但是,如果你對一個(gè)負(fù)的byte或者short類型的值進(jìn)行移位運(yùn)算,它被擴(kuò)大為int型后,它的符號也被擴(kuò)展。這樣,整數(shù)值結(jié)果的高位就會被1填充。因此,為了得到正確的結(jié)果,你就要舍棄得到結(jié)果的高位。這樣做的最簡單辦法是將結(jié)果轉(zhuǎn)換為byte型。下面的程序說明了這一點(diǎn):
// Left shifting a byte value.
class ByteShift {
public static void main(String args[]) {
byte a = 64, b;
int i;
i = a 2;
b = (byte) (a 2);
System.out.println("Original value of a: " + a);
System.out.println("i and b: " + i + " " + b);
}
}
該程序產(chǎn)生的輸出下所示:
Original value of a: 64
i and b: 256 0
因變量a在賦值表達(dá)式中,故被擴(kuò)大為int型,64(0100 0000)被左移兩次生成值256(10000 0000)被賦給變量i。然而,經(jīng)過左移后,變量b中惟一的1被移出,低位全部成了0,因此b的值也變成了0。
既然每次左移都可以使原來的操作數(shù)翻倍,程序員們經(jīng)常使用這個(gè)辦法來進(jìn)行快速的2的乘法。但是你要小心,如果你將1移進(jìn)高階位(31或63位),那么該值將變?yōu)樨?fù)值。下面的程序說明了這一點(diǎn):
// Left shifting as a quick way to multiply by 2.
class MultByTwo {
public static void main(String args[]) {
int i;
int num = 0xFFFFFFE;
for(i=0; i4; i++) {
num = num 1;
System.out.println(num);
}
}
}
該程序的輸出如下所示:
536870908
1073741816
2147483632
-32
初值經(jīng)過仔細(xì)選擇,以便在左移 4 位后,它會產(chǎn)生-32。正如你看到的,當(dāng)1被移進(jìn)31位時(shí),數(shù)字被解釋為負(fù)值。
右移運(yùn)算符
右移運(yùn)算符使指定值的所有位都右移規(guī)定的次數(shù)。它的通用格式如下所示:
value num
這里,num指定要移位值value移動的位數(shù)。也就是,右移運(yùn)算符使指定值的所有位都右移num位。
下面的程序片段將值32右移2次,將結(jié)果8賦給變量a:
int a = 32;
a = a 2; // a now contains 8
當(dāng)值中的某些位被“移出”時(shí),這些位的值將丟棄。例如,下面的程序片段將35右移2次,它的2個(gè)低位被移出丟棄,也將結(jié)果8賦給變量a:
int a = 35;
a = a 2; // a still contains 8
用二進(jìn)制表示該過程可以更清楚地看到程序的運(yùn)行過程:
00100011 35
2
00001000 8
將值每右移一次,就相當(dāng)于將該值除以2并且舍棄了余數(shù)。你可以利用這個(gè)特點(diǎn)將一個(gè)整數(shù)進(jìn)行快速的2的除法。當(dāng)然,你一定要確保你不會將該數(shù)原有的任何一位移出。
右移時(shí),被移走的最高位(最左邊的位)由原來最高位的數(shù)字補(bǔ)充。例如,如果要移走的值為負(fù)數(shù),每一次右移都在左邊補(bǔ)1,如果要移走的值為正數(shù),每一次右移都在左邊補(bǔ)0,這叫做符號位擴(kuò)展(保留符號位)(sign extension),在進(jìn)行右移操作時(shí)用來保持負(fù)數(shù)的符號。例如,–8 1 是–4,用二進(jìn)制表示如下:
11111000 –8
1
11111100 –4
一個(gè)要注意的有趣問題是,由于符號位擴(kuò)展(保留符號位)每次都會在高位補(bǔ)1,因此-1右移的結(jié)果總是–1。有時(shí)你不希望在右移時(shí)保留符號。例如,下面的例子將一個(gè)byte型的值轉(zhuǎn)換為用十六進(jìn)制表示。注意右移后的值與0x0f進(jìn)行按位與運(yùn)算,這樣可以舍棄任何的符號位擴(kuò)展,以便得到的值可以作為定義數(shù)組的下標(biāo),從而得到對應(yīng)數(shù)組元素代表的十六進(jìn)制字符。
// Masking sign extension.
class HexByte {
static public void main(String args[]) {
char hex[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f''
};
byte b = (byte) 0xf1;
System.out.println("b = 0x" + hex[(b 4) 0x0f] + hex[b 0x0f]);
}
}
該程序的輸出如下:
b = 0xf1
無符號右移
正如上面剛剛看到的,每一次右移,運(yùn)算符總是自動地用它的先前最高位的內(nèi)容補(bǔ)它的最高位。這樣做保留了原值的符號。但有時(shí)這并不是我們想要的。例如,如果你進(jìn)行移位操作的運(yùn)算數(shù)不是數(shù)字值,你就不希望進(jìn)行符號位擴(kuò)展(保留符號位)。當(dāng)你處理像素值或圖形時(shí),這種情況是相當(dāng)普遍的。在這種情況下,不管運(yùn)算數(shù)的初值是什么,你希望移位后總是在高位(最左邊)補(bǔ)0。這就是人們所說的無符號移動(unsigned shift)。這時(shí)你可以使用Java的無符號右移運(yùn)算符,它總是在左邊補(bǔ)0。下面的程序段說明了無符號右移運(yùn)算符。在本例中,變量a被賦值為-1,用二進(jìn)制表示就是32位全是1。這個(gè)值然后被無符號右移24位,當(dāng)然它忽略了符號位擴(kuò)展,在它的左邊總是補(bǔ)0。這樣得到的值255被賦給變量a。
int a = -1;
a = a 24;
下面用二進(jìn)制形式進(jìn)一步說明該操作:
11111111 11111111 11111111 11111111 int型- 1的二進(jìn)制代碼
24 無符號右移24位
00000000 00000000 00000000 11111111 int型255的二進(jìn)制代碼由于無符號右移運(yùn)算符只是對32位和64位的值有意義,所以它并不像你想象的那樣有用。因?yàn)槟阋涀?,在表達(dá)式中過小的值總是被自動擴(kuò)大為int型。這意味著符號位擴(kuò)展和移動總是發(fā)生在32位而不是8位或16位。這樣,對第7位以0開始的byte型的值進(jìn)行無符號移動是不可能的,因?yàn)樵趯?shí)際移動運(yùn)算時(shí),是對擴(kuò)大后的32位值進(jìn)行操作。下面的例子說明了這一點(diǎn):
// Unsigned shifting a byte value.
class ByteUShift {
static public void main(String args[]) {
char hex[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
byte b = (byte) 0xf1;
byte c = (byte) (b 4);
byte d = (byte) (b 4);
byte e = (byte) ((b 0xff) 4);
System.out.println(" b = 0x"
+ hex[(b 4) 0x0f] + hex[b 0x0f]);
System.out.println(" b 4 = 0x"
+ hex[(c 4) 0x0f] + hex[c 0x0f]);
System.out.println(" b 4 = 0x"
+ hex[(d 4) 0x0f] + hex[d 0x0f]);
System.out.println("( b 0xff) 4 = 0x"
+ hex[(e 4) 0x0f] + hex[e 0x0f]);
}
}
該程序的輸出顯示了無符號右移運(yùn)算符對byte型值處理時(shí),實(shí)際上不是對byte型值直接操作,而是將其擴(kuò)大到int型后再處理。在本例中變量b被賦為任意的負(fù)byte型值。對變量b右移4位后轉(zhuǎn)換為byte型,將得到的值賦給變量c,因?yàn)橛蟹栁粩U(kuò)展,所以該值為0xff。對變量b進(jìn)行無符號右移4位操作后轉(zhuǎn)換為byte型,將得到的值賦給變量d,你可能期望該值是0x0f,但實(shí)際上它是0xff,因?yàn)樵谝苿又白兞縝就被擴(kuò)展為int型,已經(jīng)有符號擴(kuò)展位。最后一個(gè)表達(dá)式將變量b的值通過按位與運(yùn)算將其變?yōu)?位,然后右移4位,然后將得到的值賦給變量e,這次得到了預(yù)想的結(jié)果0x0f。由于對變量d(它的值已經(jīng)是0xff)進(jìn)行按位與運(yùn)算后的符號位的狀態(tài)已經(jīng)明了,所以注意,對變量d再沒有進(jìn)行無符號右移運(yùn)算。
B = 0xf1
b 4 = 0xff
b 4 = 0xff
(b 0xff) 4 = 0x0f
位運(yùn)算符賦值
所有的二進(jìn)制位運(yùn)算符都有一種將賦值與位運(yùn)算組合在一起的簡寫形式。例如,下面兩個(gè)語句都是將變量a右移4位后賦給a:
a = a 4;
a = 4;
同樣,下面兩個(gè)語句都是將表達(dá)式a OR b運(yùn)算后的結(jié)果賦給a:
a = a | b;
a |= b;
下面的程序定義了幾個(gè)int型變量,然后運(yùn)用位賦值簡寫的形式將運(yùn)算后的值賦給相應(yīng)的變量:
class OpBitEquals {
public static void main(String args[]) {
int a = 1;
int b = 2;
int c = 3;
a |= 4;
b = 1;
c = 1;
a ^= c;
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
}
}
該程序的輸出如下所示:
a = 3
b = 1
c = 6
學(xué)習(xí)一門新的知識,不可能指望只看一本,或者兩本書就能夠完全掌握。需要有一個(gè)循序漸進(jìn)的閱讀過程。我推薦Oreilly出版的Java系列書籍。
在這里我只想補(bǔ)充一點(diǎn)看法,很多人學(xué)習(xí)Java是從《Thinking in Java》這本書入手的,但是我認(rèn)為這本書是不適合初學(xué)者的。我認(rèn)為正確的使用這本書的方法應(yīng)該是作為輔助的讀物。《Thinking in Java》并不是在完整的介紹Java的整個(gè)體系,而是一種跳躍式的寫作方法,是一種類似tips的方法來對Java很多知識點(diǎn)進(jìn)行了深入的分析和解釋。
對于初學(xué)者來說,最好是找一本Java入門的書籍,但是比較完整的循序的介紹Java的語法,面向?qū)ο蟮奶匦裕诵念悗斓鹊?,在看這本書的同時(shí),可以同步來看《Thinking in Java》,來加深對Java的理解和原理的運(yùn)用,同時(shí)又可以完整的了解Java的整個(gè)體系。
對于Java的入門書籍,蔡學(xué)鏞推薦的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition(針對C++背景)》,我并沒有看過這兩本書。其實(shí)我覺得電子工業(yè)出版社的《Java 2編程詳解》或者《Java 2從入門到精通》就很不錯(cuò)。
在所有的Java書籍當(dāng)中,其實(shí)最最有用的,并不是O'reilly的 Java Serials,真正最最有用處是JDK的Documentation!幾乎你想獲得的所有的知識在Documentation里面全部都有,其中最主要的部分當(dāng)然是Java基礎(chǔ)類庫的API文檔,是按照package來組織的,對于每一個(gè)class都有詳細(xì)的解釋,它的繼承關(guān)系,是否實(shí)現(xiàn)了某個(gè)接口,通常用在哪些場合,還可以查到它所有的public的屬性和方法,每個(gè)屬性的解釋,意義,每個(gè)方法的用途,調(diào)用的參數(shù),參數(shù)的意義,返回值的類型,以及方法可能拋出的異常等等??梢赃@樣來說,所有關(guān)于Java編程方面的書籍其實(shí)都不過是在用比較通俗易懂的語言,和良好的組織方式來介紹 Documentation里面的某個(gè)package里面包含的一些類的用法而已。所以萬變不離其宗,如果你有足夠的能力來直接通過 Documentation來學(xué)習(xí)Java的類庫,那么基本上就不需要看其他的書籍了。除此之外,Documentation也是編程必備的手冊,我的桌面上有三個(gè)Documentation的快捷方式,分別是J2SDK1.4.1的Documentation,Servlet2.3的 Documentation和J2SDKEE1.3.1的Documentation。有了這個(gè)三個(gè)Documentation,什么其他的書籍都不需要了。
對于Java Web 編程來說,最核心的是要熟悉和掌握HTTP協(xié)議,這個(gè)就和Java無關(guān)了,在熟悉HTTP協(xié)議之后,就需要熟悉Java的實(shí)現(xiàn)HTTP協(xié)議的類庫,也就是 Servlet API,所以最重要的東西就是Servlet API。當(dāng)然對于初學(xué)者而言,直接通過Servlet API來學(xué)習(xí)Web編程有很大的難度,我推薦O'reilly的《Java Server Pages 》這本書來學(xué)習(xí)Web 編程。
EJB的書籍當(dāng)中,《Enterprise JavaBeans, 2nd Edition》是一本很不錯(cuò)的書, EJB的學(xué)習(xí)門檻是比較高,入門很難,但是這本書完全降低了學(xué)習(xí)的難度,特別重要的一點(diǎn)是,EJB的學(xué)習(xí)需要結(jié)合一種App Server的具體實(shí)現(xiàn),所以在學(xué)習(xí)EJB的同時(shí),必須同步的學(xué)習(xí)某種App Server,而這本書相關(guān)的出了三本書,分別是Weblogic6.1,Websphere4.0和JBoss3.0上面部署書中例子的實(shí)做。真是既有理論,又有實(shí)踐。在學(xué)習(xí)EJB的同時(shí),可以邊看邊做,EJB的學(xué)習(xí)會變得很輕松。
但是這本書也有一個(gè)問題,就是版本比較舊,主要講EJB1.1規(guī)范和部分EJB2.0的規(guī)范。而Ed Roman寫的《Mastering EJB 2.0》這本書完全是根據(jù)EJB2.0規(guī)范寫的,深入淺出,覆蓋了EJB編程的各個(gè)方面,并且還有很多編程經(jīng)驗(yàn)tips,也是學(xué)習(xí)EJB非常推薦的書籍之一。
如果是結(jié)合Weblogic來學(xué)習(xí)J2EE的話,《J2EE應(yīng)用與BEA Weblogic Server》絕對是首選讀物,雖然是講述的Weblogic6.0,仍然值得購買,這本書是BEA官方推薦的教材,作者也是BEA公司的工程師?,F(xiàn)在中文版已經(jīng)隨處可見了。這本書結(jié)合Weblogic介紹了J2EE各個(gè)方面的技術(shù)在Weblogic平臺上的開發(fā)和部署,實(shí)踐指導(dǎo)意義非常強(qiáng)。
在掌握了Java平臺基礎(chǔ)知識和J2EE方面的知識以后,更進(jìn)一步的是學(xué)習(xí)如何運(yùn)用OO的方法進(jìn)行軟件的設(shè)計(jì),那么就一定要學(xué)習(xí)“設(shè)計(jì)模式”。 Sun公司出版了一本《J2EE核心模式》,是每個(gè)開發(fā)Java企業(yè)平臺軟件的架構(gòu)師必備的書籍。這本書全面的介紹了J2EE體系架構(gòu)的各種設(shè)計(jì)模式,是設(shè)計(jì)師的必讀書籍。
Java Learning Path(三)過程篇
每個(gè)人的學(xué)習(xí)方法是不同的,一個(gè)人的方法不見得適合另一個(gè)人,我只能是談自己的學(xué)習(xí)方法。因?yàn)槲覍W(xué)習(xí)Java是完全自學(xué)的,從來沒有問過別人,所以學(xué)習(xí)的過程基本上完全是自己摸索出來的。我也不知道這種方法是否是比較好的方法,只能給大家提供一點(diǎn)參考了。
學(xué)習(xí)Java的第一步是安裝好JDK,寫一個(gè)Hello World,? 其實(shí)JDK的學(xué)習(xí)沒有那么簡單,關(guān)于JDK有兩個(gè)問題是很容易一直困擾Java程序員的地方:一個(gè)是CLASSPATH的問題,其實(shí)從原理上來說,是要搞清楚JRE的ClassLoader是如何加載Class的;另一個(gè)問題是package和import問題,如何來尋找類的路徑問題。把這兩個(gè)問題摸索清楚了,就掃除了學(xué)習(xí)Java和使用JDK的最大障礙。推薦看一下王森的《Java深度歷險(xiǎn)》,對這兩個(gè)問題進(jìn)行了深入的探討。
第二步是學(xué)習(xí)Java的語法。Java的語法是類C++的,基本上主流的編程語言不是類C,就是類C++的,沒有什么新東西,所以語法的學(xué)習(xí),大概就是半天的時(shí)間足夠了。唯一需要注意的是有幾個(gè)不容易搞清楚的關(guān)鍵字的用法,public,protected,private,static,什么時(shí)候用,為什么要用,怎么用,這可能需要有人來指點(diǎn)一下,我當(dāng)初是完全自己琢磨出來的,花了很久的時(shí)間。不過后來我看到《Thinking in Java》這本書上面是講了這些概念的。
第三步是學(xué)習(xí)Java的面向?qū)ο蟮木幊陶Z言的特性的地方。比如繼承,構(gòu)造器,抽象類,接口,方法的多態(tài),重載,覆蓋,Java的異常處理機(jī)制。對于一個(gè)沒有面向?qū)ο笳Z言背景的人來說,我覺得這個(gè)過程需要花很長很長時(shí)間,因?yàn)閷W(xué)習(xí)Java之前沒有C++的經(jīng)驗(yàn),只有C的經(jīng)驗(yàn),我是大概花了一個(gè)月左右吧,才徹底把這些概念都搞清楚,把書上面的例子反復(fù)的揣摩,修改,嘗試,把那幾章內(nèi)容反復(fù)的看過來,看過去,看了不下5遍,才徹底領(lǐng)悟了。不過我想如果有 C++經(jīng)驗(yàn)的話,應(yīng)該一兩天時(shí)間足夠了。那么在這個(gè)過程中,可以多看看《Thinking in Java》這本書,對面向?qū)ο蟮闹v解非常透徹。可惜的是我學(xué)習(xí)的時(shí)候,并沒有看到這本書,所以自己花了大量的時(shí)間,通過自己的嘗試和揣摩來學(xué)會的。
第四步就是開始熟悉Java的類庫。Java的基礎(chǔ)類庫其實(shí)就是JDK安裝目錄下面jre\lib\rt.jar這個(gè)包。學(xué)習(xí)基礎(chǔ)類庫就是學(xué)習(xí)rt.jar。基礎(chǔ)類庫里面的類非常非常多。據(jù)說有3000多個(gè),我沒有統(tǒng)計(jì)過。但是真正對于我們來說最核心的只有4個(gè),分別是
java.lang.*;
java.io.*;
java.util.*;
java.sql.*;
這四個(gè)包的學(xué)習(xí),每個(gè)包的學(xué)習(xí)都可以寫成一本厚厚的教材,而O'reilly也確實(shí)是這樣做的。我覺得如果時(shí)間比較緊,是不可能通過讀四本書來學(xué)習(xí)。我覺得比較好的學(xué)習(xí)方法是這樣的:
首先要通讀整個(gè)package的框架,了解整個(gè)package的class,interface,exception的構(gòu)成,最好是能夠找到介紹整個(gè)包框架的文章。這些專門介紹包的書籍的前幾章應(yīng)該就是這些總體的框架內(nèi)容介紹。
對包整體框架的把握并不是要熟悉每個(gè)類的用法,記住它有哪些屬性,方法。想記也記不住的。而是要知道包有哪些方面的類構(gòu)成的,這些類的用途是什么,最核心的幾個(gè)類分別是完成什么功能的。我在給人培訓(xùn)的時(shí)候一般是一次課講一個(gè)包,所以不可能詳細(xì)的介紹每個(gè)類的用法,但是我反復(fù)強(qiáng)調(diào),我給你們講這些包的不是要告訴你們類的方法是怎么調(diào)用的,也不要求你們記住類的方法調(diào)用,而是要你們了解,Java給我們提供了哪些類,每個(gè)類是用在什么場合,當(dāng)我遇到問題的時(shí)候,我知道哪個(gè)類,或者哪幾個(gè)類的組合可以解決我的問題,That'all!,當(dāng)我們具體寫程序的時(shí)候,只要你知道該用哪個(gè)類來完成你的工作就足夠了。編碼的時(shí)候,具體的方法調(diào)用,是邊寫代碼,邊查Documentation,所有的東西都在Documentation里面,不要求你一定記住,實(shí)際你也記不住3000多個(gè)類的總共將近10萬個(gè)方法調(diào)用。所以對每個(gè)包的總體框架的把握就變得極為重要。
第五步,通過上面的學(xué)習(xí),如果學(xué)的比較扎實(shí)的話,就打好了Java的基礎(chǔ)了,剩下要做的工作是掃清Documentation里面除了上面4個(gè)包之外的其他一些比較有用處的類。相信進(jìn)展到這一步,Java的自學(xué)能力已經(jīng)被培養(yǎng)出來了,可以到了直接學(xué)習(xí)Documentation的水平了。除了要做 GUI編程之外,JDK里面其他會有用處的包是這些:
java.text.*;
java.net.*;
javax.naming.*;
這些包里面真正用的比較多的類其實(shí)很少,只有幾個(gè),所以不需要花很多時(shí)間。
第六步,Java Web 編程
Web編程的核心是HTTP協(xié)議,HTTP協(xié)議和Java無關(guān),如果不熟悉HTTP協(xié)議的話,雖然也可以學(xué)好Servlet/JSP編程,但是達(dá)不到舉一反三,一通百通的境界。所以HTTP協(xié)議的學(xué)習(xí)是必備的。如果熟悉了HTTP協(xié)議的話,又有了Java編程的良好的基礎(chǔ),學(xué)習(xí) Servlet/JSP簡直易如反掌,我學(xué)習(xí)Servlet/JSP就用了不到一周的時(shí)間,然后就開始用JSP來做項(xiàng)目了。
在Servlet/JSP的學(xué)習(xí)中,重頭仍然是Servlet Documentation。Servlet API最常用的類很少,花比較少的時(shí)間就可以掌握了。把這些類都看一遍,多寫幾個(gè)例子試試。Servlet/JSP編程本質(zhì)就是在反復(fù)調(diào)用這些類來通過 HTTP協(xié)議在Web Server和Brower之間交談。另外對JSP,還需要熟悉幾個(gè)常用JSP的標(biāo)記,具體的寫法記不住的話,臨時(shí)查就是了。
此外Java Web編程學(xué)習(xí)的重點(diǎn)要放在Web Application的設(shè)計(jì)模式上,如何進(jìn)行業(yè)務(wù)邏輯的分析,并且進(jìn)行合理的設(shè)計(jì),按照MVC設(shè)計(jì)模式的要求,運(yùn)用Servlet和JSP分別完成不同的邏輯層,掌握如何在Servlet和JSP之間進(jìn)行流程的控制和數(shù)據(jù)的共享,以及Web Application應(yīng)該如何配置和部署。
第七步,J2EE編程
以上的學(xué)習(xí)過程如果是比較順利的話,進(jìn)行到這一步,難度又陡然提高。因?yàn)樯厦娴闹R內(nèi)容都是只涉及一個(gè)方面,而像EJB,JMS,JTA等核心的J2EE規(guī)范往往是幾種Java技術(shù)的綜合運(yùn)用的結(jié)晶,所以掌握起來難度比較大。
首先一定要學(xué)習(xí)好JNDI,JNDI是App Server定位服務(wù)器資源(EJB組件,Datasouce,JMS)查找方法,如果對JNDI不熟悉的話,EJB,JMS這些東西幾乎學(xué)不下去。 JNDI其實(shí)就是javax.naming.*這個(gè)包,運(yùn)用起來很簡單。難點(diǎn)在于服務(wù)器資源文件的配置。對于服務(wù)器資源文件的配置,就需要看看專門的文檔規(guī)范了,比如web.xml的寫法,ejb-jar.xml的寫法等等。針對每種不同的App Server,還有自己的服務(wù)資源配置文件,也是需要熟悉的。
然后可以學(xué)習(xí)JTA,主要是要理解JTA對于事務(wù)的控制的方法,以及該在什么場合使用JTA。這里可以簡單的舉個(gè)例子,我們知道一般情況可以對于一個(gè)數(shù)據(jù)庫連接進(jìn)行事務(wù)控制(conn.setAutoCommit(false),....,conn.commit()),做為一個(gè)原子操作,但是假設(shè)我的業(yè)務(wù)需求是要把對兩個(gè)不同數(shù)據(jù)庫的操作做為一個(gè)原子操作,你能做的到嗎?這時(shí)候只能用JTA了。假設(shè)操作過程是先往A數(shù)據(jù)庫插一條記錄,然后刪除B 數(shù)據(jù)庫另一個(gè)記錄,我們自己寫代碼是控制不了把整個(gè)操作做為一個(gè)原子操作的。用JTA的話,由App Server來完成控制。
在學(xué)習(xí)EJB之前要學(xué)習(xí)對象序列化和RMI,RMI是EJB的基礎(chǔ)。接著學(xué)習(xí)JMS和EJB,對于EJB來說,最關(guān)鍵是要理解EJB是如何通過RMI來實(shí)現(xiàn)對遠(yuǎn)端對象的調(diào)用的,以及在什么情況下要用到EJB。
在學(xué)習(xí)完EJB,JMS這些東西之后,你可能會意識到要急不可待學(xué)習(xí)兩個(gè)領(lǐng)域的知識,一個(gè)是UML,另一個(gè)是Design Pattern。Java企業(yè)軟件的設(shè)計(jì)非常重視框架(Framework)的設(shè)計(jì),一個(gè)好的軟件框架是軟件開發(fā)成功的必要條件。在這個(gè)時(shí)候,應(yīng)該開始把學(xué)習(xí)的重點(diǎn)放在設(shè)計(jì)模式和框架的學(xué)習(xí)上,通過學(xué)習(xí)和實(shí)際的編程經(jīng)驗(yàn)來掌握EJB的設(shè)計(jì)模式和J2EE的核心模式。
J2EE規(guī)范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外還有很多很多的企業(yè)技術(shù),這里不一一進(jìn)行介紹了。
另外還有一個(gè)最新領(lǐng)域Web Services。Web Services也完全沒有任何新東西,它像是一種黏合劑,可以把不同的服務(wù)統(tǒng)一起來提供一個(gè)統(tǒng)一的調(diào)用接口,作為使用者來說,我只要獲得服務(wù)提供者給我的WSDL(對服務(wù)的描述),就夠了,我完全不知道服務(wù)器提供者提供的服務(wù)究竟是EJB組件,還是.Net組件,還是什么CORBA組件,還是其他的什么實(shí)現(xiàn),我也不需要知道。Web Services最偉大的地方就在于通過統(tǒng)一的服務(wù)提供方式和調(diào)用方式,實(shí)現(xiàn)了整個(gè)Internet服務(wù)的共享,是一個(gè)非常令人激動的技術(shù)領(lǐng)域。Web Services好像目前還沒有什么很好的書籍,但是可以通過在網(wǎng)絡(luò)上面查資料的方式來學(xué)習(xí)。
Java Learning Path(四) 方法篇
Java作為一門編程語言,最好的學(xué)習(xí)方法就是寫代碼。當(dāng)你學(xué)習(xí)一個(gè)類以后,你就可以自己寫個(gè)簡單的例子程序來運(yùn)行一下,看看有什么結(jié)果,然后再多調(diào)用幾個(gè)類的方法,看看運(yùn)行結(jié)果,這樣非常直觀的把類給學(xué)會了,而且記憶非常深刻。然后不應(yīng)該滿足把代碼調(diào)通,你應(yīng)該想想看如果我不這樣寫,換個(gè)方式,再試試行不行。記得哪個(gè)高人說過學(xué)習(xí)編程就是個(gè)破壞的過程,把書上的例子,自己學(xué)習(xí)Documentation編寫的例子在運(yùn)行通過以后,不斷的嘗試著用不同的方法實(shí)現(xiàn),不斷的嘗試破壞代碼的結(jié)構(gòu),看看它會有什么結(jié)果。通過這樣的方式,你會很徹底的很精通的掌握J(rèn)ava。
舉個(gè)例子,我們都編過Hello World
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
很多初學(xué)者不是很理解為什么main方法一定要這樣來定義public static void main(String[] args),能不能不這樣寫?包括我剛學(xué)習(xí)Java的時(shí)候也有這樣的疑問。想知道答案嗎?很簡單,你把main改個(gè)名字運(yùn)行一下,看看報(bào)什么錯(cuò)誤,然后根據(jù)出錯(cuò)信息進(jìn)行分析;把main的public取掉,在試試看,報(bào)什么錯(cuò)誤;static去掉還能不能運(yùn)行;不知道m(xù)ain方法是否一定要傳一個(gè) String[]數(shù)組的,把String[]改掉,改成int[],或者String試試看;不知道是否必須寫args參數(shù)名稱的,也可以把a(bǔ)rgs改成別的名字,看看運(yùn)行結(jié)果如何。
我當(dāng)初學(xué)習(xí)Java的時(shí)候就是這樣做的,把Hello World程序反復(fù)改了七八次,不斷運(yùn)行,分析運(yùn)行結(jié)果,最后就徹底明白為什么了main方法是這樣定義的了。
此外,我對于staic,public,private,Exception,try{ }catch {}finally{}等等等等一開始都不是很懂,都是把參考書上面的例子運(yùn)行成功,然后就開始破壞它,不斷的根據(jù)自己心里面的疑問來重新改寫程序,看看能不能運(yùn)行,運(yùn)行出來是個(gè)什么樣子,是否可以得到預(yù)期的結(jié)果。這樣雖然比較費(fèi)時(shí)間,不過一個(gè)例子程序這樣反復(fù)破壞幾次之后。我就對這個(gè)相關(guān)的知識徹底學(xué)通了。有時(shí)候甚至故意寫一些錯(cuò)誤的代碼來運(yùn)行,看看能否得到預(yù)期的運(yùn)行錯(cuò)誤。這樣對于編程的掌握是及其深刻的。
其中特別值得一提的是JDK有一個(gè)非常棒的調(diào)試功能,-verbose
java –verbose
javac –verbose 以及其它很多JDK工具都有這個(gè)選項(xiàng)
-verbose 可以顯示在命令執(zhí)行的過程中,JVM都依次加載哪里Class,通過這些寶貴的調(diào)試信息,可以幫助我們分析出JVM在執(zhí)行的過程中都干了些什么。
另外,自己在學(xué)習(xí)過程中,寫的很多的這種破壞例程,應(yīng)該有意識的分門別類的保存下來,在工作中積累的典型例程也應(yīng)該定期整理,日積月累,自己就有了一個(gè)代碼庫了。遇到類似的問題,到代碼庫里面 Copy Paste ,Search Replace,就好了,極大提高了開發(fā)速度。最理想的情況是把一些通用的例程自己再抽象一層,形成一個(gè)通用的類庫,封裝好。那么可復(fù)用性就更強(qiáng)了。
所以我覺得其實(shí)不是特別需要例程的,自己寫的破壞例程就是最好的例子,如果你實(shí)在對自己寫的代碼不放心的話,我強(qiáng)烈推薦你看看JDK基礎(chǔ)類庫的 Java源代碼。在JDK安裝目錄下面會有一個(gè)src.zip,解開來就可以完整的看到整個(gè)JDK基礎(chǔ)類庫,也就是rt.jar的Java源代碼,你可以參考一下Sun是怎么寫Java程序的,規(guī)范是什么樣子的。我自己在學(xué)習(xí)Java的類庫的時(shí)候,當(dāng)有些地方理解的不是很清楚的時(shí)候,或者想更加清晰的理解運(yùn)作的細(xì)節(jié)的時(shí)候,往往會打開相應(yīng)的類的源代碼,通過看源代碼,所有的問題都會一掃而空。
Java Learning Path(五)資源篇
1、 (英文)
Sun的Java網(wǎng)站,是一個(gè)應(yīng)該經(jīng)常去看的地方。不用多說。
2、
IBM的developerWorks網(wǎng)站,英語好的直接去英文主站點(diǎn)看。這里不但是一個(gè)極好的面向?qū)ο蟮姆治鲈O(shè)計(jì)網(wǎng)站,也是Web Services,Java,Linux極好的網(wǎng)站。強(qiáng)烈推薦?。。?/p>
3、 (英文)
關(guān)于Java很多新技術(shù)的討論和新聞。想多了解Java的方方面面的應(yīng)用,這里比較好。
4、
BEA的開發(fā)者園地,BEA作為最重要的App Server廠商,有很多獨(dú)到的技術(shù),在Weblogic上做開發(fā)的朋友不容錯(cuò)過。
5、
灰狐動力網(wǎng)站,一個(gè)專業(yè)的中間件網(wǎng)站,雖然不是專業(yè)的Java網(wǎng)站,但是在J2EE企業(yè)應(yīng)用技術(shù)方面有深厚的造詣。
6、 (英文)
TheServerSide是一個(gè)著名的專門面向Java Server端應(yīng)用的網(wǎng)站。
7、
Java研究組織,有很多優(yōu)秀的Java方面的文章和教程,特別是在JDO方面的文章比較豐富。
8、
JSP技術(shù)網(wǎng)站,有相當(dāng)多的Java方面的文章和資源。
9、
Jdon論壇,是一個(gè)個(gè)人性質(zhì)的中文J2EE專業(yè)技術(shù)論壇,在眾多的Java的中文論壇中,Jdon一個(gè)是技術(shù)含量非常高,帖子質(zhì)量非常好的論壇。
10、
SourgeForge是一個(gè)開放源代碼軟件的大本營,其中也有非常非常豐富的Java的開放源代碼的著名的軟件。
參考資料:還有JAVA中文網(wǎng)站
=================================================================
=================================================================
-----------------------------------------------------------------
程序員是一種技術(shù)工作,在IT的發(fā)展中有相當(dāng)重要的地位,從底層硬件通訊協(xié)議的建立, 到數(shù)據(jù)傳輸層的處理,到操作系統(tǒng)的建設(shè),到數(shù)據(jù)庫平臺的建設(shè),一直到應(yīng)用層上各種數(shù) 據(jù)營銷平臺的搭建,程序員在里面都扮演著舉足輕重的角色并為IT事業(yè)的發(fā)展做出了巨大 的貢獻(xiàn)。
中國有很多精于編碼的人,但是中國軟件行業(yè),尤其是網(wǎng)絡(luò)應(yīng)用開發(fā)方面誤區(qū)很大,很難形成有規(guī)模的軟件開發(fā)力量和產(chǎn)品能力,不但比美國差距甚遠(yuǎn),和印度相比也是頗有不如。這些問題不是在于中國程序員的智商和工作努力狀況,也不是在于國家和民間對開發(fā)的投入程度,而是很大程度上,有一些對技術(shù),對程序開發(fā),對項(xiàng)目設(shè)計(jì)方面的思想誤區(qū),這些誤區(qū),導(dǎo)致了軟件行業(yè)的產(chǎn)品化能力不足,缺乏規(guī)?;痛笮蛷?fù)用系統(tǒng)研發(fā)能力,可以說,改變認(rèn)識誤區(qū),是解決軟件行業(yè)小作坊模式和個(gè)體英雄模式所帶來的局限性 的重要工作。
中國有很多小朋友,他們18,9歲或21,2歲,通過自學(xué)也寫了不少代碼,他們有的代碼寫的很漂亮,一些技術(shù)細(xì)節(jié)相當(dāng)出眾,也很有鉆研精神,但是他們被一些錯(cuò)誤的認(rèn)識和觀點(diǎn)左右,缺乏對系統(tǒng),對程序的整體理解能力,這些人,一個(gè)網(wǎng)上的朋友說得很好,他們實(shí)際 上只是一些Coding fans,壓根沒有資格稱為程序員,但是據(jù)我所知,不少小網(wǎng)絡(luò)公司的 CTO就是這樣的coding fans,拿著嚇人的工資,做著嚇人的項(xiàng)目,項(xiàng)目的結(jié)局通常也很嚇 人。
程序員基本素質(zhì):
作一個(gè)真正合格的程序員,或者說就是可以真正合格完成一些代碼工作的程序員,應(yīng)該具 有的素質(zhì)。
1:團(tuán)隊(duì)精神和協(xié)作能力
把它作為基本素質(zhì),并不是不重要,恰恰相反,這是程序員應(yīng)該具備的最基本的,也是最重要的安身立命之本。把高水平程序員說成獨(dú)行俠的都是在囈語,任何個(gè)人的力量都是有限的,即便如linus這樣的天才,也需要通過組成強(qiáng)大的團(tuán)隊(duì)來創(chuàng)造奇跡,那些遍布全球的為linux寫核心的高手們,沒有協(xié)作精神是不可想象的。獨(dú)行俠可以作一些賺錢的小軟件發(fā)點(diǎn)小財(cái),但是一旦進(jìn)入一些大系統(tǒng)的研發(fā)團(tuán)隊(duì),進(jìn)入商業(yè)化和產(chǎn)品化的開發(fā)任務(wù),缺乏這種素質(zhì)的人就完全不合格了。
2:文檔習(xí)慣
說高水平程序員從來不寫文檔的肯定是乳臭未干的毛孩子,良好的文檔是正規(guī)研發(fā)流程中 非常重要的環(huán)節(jié),作為代碼程序員,30%的工作時(shí)間寫技術(shù)文檔是很正常的,而作為高級 程序員和系統(tǒng)分析員,這個(gè)比例還要高很多。
缺乏文檔,一個(gè)軟件系統(tǒng)就缺乏生命力,在未來的查錯(cuò),升級以及模塊的復(fù)用時(shí)就都會遇 到極大的麻煩。
3:規(guī)范化,標(biāo)準(zhǔn)化的代碼編寫習(xí)慣
作為一些外國知名軟件公司的規(guī)矩,代碼的變量命名,代碼內(nèi)注釋格式,甚至嵌套中行縮 進(jìn)的長度和函數(shù)間的空行數(shù)字都有明確規(guī)定,良好的編寫習(xí)慣,不但有助于代碼的移植和 糾錯(cuò),也有助于不同技術(shù)人員之間的協(xié)作。
有些coding fans叫囂高水平程序員寫的代碼旁人從來看不懂,這種叫囂只能證明他們自 己壓根不配自稱程序員。代碼具有良好的可讀性,是程序員基本的素質(zhì)需求。
再看看整個(gè)linux的搭建,沒有規(guī)范化和標(biāo)準(zhǔn)化的代碼習(xí)慣,全球的研發(fā)協(xié)作是絕對不可 想象的。
4:需求理解能力
程序員需要理解一個(gè)模塊的需求,很多小朋友寫程序往往只關(guān)注一個(gè)功能需求,他們把性能指標(biāo)全部歸結(jié)到硬件,操作系統(tǒng)和開發(fā)環(huán)境上,而忽視了本身代碼的性能考慮,有人曾經(jīng)放言說寫一個(gè)廣告交換程序很簡單,這種人從來不知道在百萬甚至千萬數(shù)量級的訪問情況下的性能指標(biāo)是如何實(shí)現(xiàn)的,對于這樣的程序員,你給他深藍(lán)那套系統(tǒng),他也做不出太極鏈的并訪能力。性能需求指標(biāo)中,穩(wěn)定性,并訪支撐能力以及安全性都很重要,作為程序員需要評估該模塊在系統(tǒng)運(yùn)營中所處的環(huán)境,將要受到的負(fù)荷壓力以及各種潛在的危險(xiǎn)和惡意攻擊的可能性。就這一點(diǎn),一個(gè)成熟的程序員至少需要2到3年的項(xiàng)目研發(fā)和跟蹤經(jīng)驗(yàn)才有可能有心得。
5:復(fù)用性,模塊化思維能力
經(jīng)常可以聽到一些程序員有這樣的抱怨,寫了幾年程序,變成了熟練工,每天都是重復(fù)寫 一些沒有任何新意的代碼,這其實(shí)是中國軟件人才最大浪費(fèi)的地方,一些重復(fù)性工作變成 了熟練程序員的主要工作,而這些,其實(shí)是完全可以避免的。
復(fù)用性設(shè)計(jì),模塊化思維就是要程序員在完成任何一個(gè)功能模塊或函數(shù)的時(shí)候,要多想一些,不要局限在完成當(dāng)前任務(wù)的簡單思路上,想想看該模塊是否可以脫離這個(gè)系統(tǒng)存在,是否可以通過簡單的修改參數(shù)的方式在其他系統(tǒng)和應(yīng)用環(huán)境下直接引用,這樣就能極大避免重復(fù)性的開發(fā)工作,如果一個(gè)軟件研發(fā)單位和工作組能夠在每一次研發(fā)過程中都考慮到這些問題,那么程序員就不會在重復(fù)性的工作中耽誤太多時(shí)間,就會有更多時(shí)間和精力投 入到創(chuàng)新的代碼工作中去。
一些好的程序模塊代碼,即便是70年代寫成的,拿到現(xiàn)在放到一些系統(tǒng)里面作為功能模塊 都能適合的很好,而現(xiàn)在我看到的是,很多小公司軟件一升級或改進(jìn)就動輒全部代碼重 寫,大部分重復(fù)性工作無謂的浪費(fèi)了時(shí)間和精力。
程序員應(yīng)具備的素質(zhì)中
6:測試習(xí)慣
作為一些商業(yè)化正規(guī)化的開發(fā)而言,專職的測試工程師是不可少的,但是并不是說有了專職的測試工程師程序員就可以不進(jìn)行自測;軟件研發(fā)作為一項(xiàng)工程而言,一個(gè)很重要的特點(diǎn)就是問題發(fā)現(xiàn)的越早,解決的代價(jià)就越低,程序員在每段代碼,每個(gè)子模塊完成后進(jìn)行認(rèn)真的測試,就可以盡量將一些潛在的問題最早的發(fā)現(xiàn)和解決,這樣對整體系統(tǒng)建設(shè)的效 率和可靠性就有了最大的保證。
測試工作實(shí)際上需要考慮兩方面,一方面是正常調(diào)用的測試,也就是看程序是否能在正常調(diào)用下完成基本功能,這是最基本的測試職責(zé),可惜在很多公司這成了唯一的測試任務(wù),實(shí)際上還差的遠(yuǎn)那;第二方面就是異常調(diào)用的測試,比如高壓力負(fù)荷下的穩(wěn)定性測試,用戶潛在的異常輸入情況下的測試,整體系統(tǒng)局部故障情況下該模塊受影響狀況的測試,頻發(fā)的異常請求阻塞資源時(shí)的模塊穩(wěn)定測試等等。當(dāng)然并不是程序員要對自己的每段代碼都需要進(jìn)行這種完整測試,但是程序員必須清醒認(rèn)識自己的代碼任務(wù)在整體項(xiàng)目中的地位和各種性能需求,有針對性的進(jìn)行相關(guān)測試并盡早發(fā)現(xiàn)和解決問題,當(dāng)然這需要上面提到的 需求理解能力。
7:學(xué)習(xí)和總結(jié)的能力
程序員是人才很容易被淘汰,很容易落伍的職業(yè),因?yàn)橐环N技術(shù)可能僅僅在三兩年內(nèi)具有 領(lǐng)先性,程序員如果想安身立命,就必須不斷跟進(jìn)新的技術(shù),學(xué)習(xí)新的技能。
善于學(xué)習(xí),對于任何職業(yè)而言,都是前進(jìn)所必需的動力,對于程序員,這種要求就更加高 了。
但是學(xué)習(xí)也要找對目標(biāo),一些小coding fans們,他們也津津樂道于他們的學(xué)習(xí)能力,一會學(xué)會了asp,一會兒學(xué)會了php,一會兒學(xué)會了jsp,他們把這個(gè)作為炫耀的資本,盲目的追逐一些膚淺的,表面的東西和名詞,做網(wǎng)絡(luò)程序不懂通訊傳輸協(xié)議,做應(yīng)用程序不懂中斷向量處理,這樣的技術(shù)人員,不管掌握了多少所謂的新語言,永遠(yuǎn)不會有質(zhì)的提高。
善于總結(jié),也是學(xué)習(xí)能力的一種體現(xiàn),每次完成一個(gè)研發(fā)任務(wù),完成一段代碼,都應(yīng)當(dāng)有 目的的跟蹤該程序的應(yīng)用狀況和用
沉下心來,學(xué)習(xí)本來就是枯燥無味的,學(xué)會了才會有成就感。學(xué)編程要多寫多寫多寫,開始能理解最好,不能理解就多記。java首先要理解面向?qū)ο?、繼承、多態(tài),以及所有java代碼都是運(yùn)行在一個(gè)封閉的JVM里的,也就是JVM支撐了所有的java的程序。然后基礎(chǔ)很重要,要理解java的8種基本類型、數(shù)組和對象類型(對象類型的構(gòu)成,靜態(tài)代碼塊,成員變量和方法),然后再學(xué)java內(nèi)建的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)都是基于基本類型、數(shù)組和對象類型構(gòu)建的,本質(zhì)數(shù)據(jù)關(guān)聯(lián)分兩種,一種是基于數(shù)組(物理關(guān)聯(lián)),還有一種基于對象引用(邏輯關(guān)聯(lián))來構(gòu)建,再復(fù)雜一點(diǎn)的數(shù)據(jù)結(jié)構(gòu)就是會引入一些策略。后面再看多線程和IO、注解和反射,然后再學(xué)習(xí)主流的框架怎么使用,再深入框架思想。希望對你有幫助。