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