其實(shí)這個(gè)問題沒有什么好說的,Java里面一切都是對(duì)象,是對(duì)象的話,字符串肯定就有長(zhǎng)度,即然有長(zhǎng)度,編譯器就可以確定要輸出的字符個(gè)數(shù),當(dāng)然也就沒有必要去浪費(fèi)那1字節(jié)的空間用以標(biāo)明字符串的結(jié)束了。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供安遠(yuǎn)網(wǎng)站建設(shè)、安遠(yuǎn)做網(wǎng)站、安遠(yuǎn)網(wǎng)站設(shè)計(jì)、安遠(yuǎn)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、安遠(yuǎn)企業(yè)網(wǎng)站模板建站服務(wù),十年安遠(yuǎn)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
學(xué)過C/C++的人都有一種固定的思維模式,凡是字符串都是以\0結(jié)束,其實(shí)C++中未必,不信你查查string這個(gè)泛型類,為了與C語(yǔ)言兼容性,它里面有一個(gè)方法c_str()就是返回以\0結(jié)束的字符串。
下面是C++/C代碼
char
str[]=”test”;//這個(gè)占5個(gè)字節(jié)
為什么是5個(gè)字節(jié),因?yàn)镃語(yǔ)言的標(biāo)準(zhǔn)輸出函數(shù)printf對(duì)字符串進(jìn)行輸出時(shí),會(huì)判斷當(dāng)前字符是不是\0,如果是\0的話,就停止輸出。不信,你可以看看Linux下的Vsprintf.c這個(gè)文件
Java中:
char
[]str=”test”;//編譯都通不過
char
[]str=new
char[10];//這樣才行,也就是直接指定了其大小
在java中數(shù)組其實(shí)就是一個(gè)對(duì)象,學(xué)習(xí)java時(shí),我們都接觸的一句話就是everythingis
object,因此數(shù)組也不例外,數(shù)組對(duì)象里還有一個(gè)屬性叫做length,就是數(shù)組的長(zhǎng)度,因此對(duì)于輸出函數(shù)來說,有直接的大小可以判斷字符串的邊界,編譯器就沒必要再去浪費(fèi)一個(gè)空間標(biāo)識(shí)字符串的結(jié)束。
Java中的String類
如下String
str=”test”;為什么不能/0作為結(jié)束呢,其實(shí)上面也說了,String類里面本身就有方法length()可以確定字符串的長(zhǎng)度,因些輸出時(shí)完全可以根據(jù)這個(gè)長(zhǎng)度來輸出,當(dāng)我們調(diào)用
System.out.println(str),看源碼的話,真正調(diào)用的是如下這個(gè)函數(shù):
public
void
write(String
str,
int
off,
int
len)
throws
IOException
{
synchronized
(lock)
{
char
cbuf[]
//如果長(zhǎng)度小于1K的話;
if
(len
=
writeBufferSize)
{
if
(writeBuffer
==
null)
{//如果writeBuffer屬于第一次使用,還沒申請(qǐng)緩存空間時(shí)
writeBuffer
=
new
char[writeBufferSize];
}
cbuf
=
writeBuffer;
}//大于1K的話
else
{
//
Don't
permanently
allocate
very
large
buffers.
cbuf
=
new
char[len];
}//將str存入緩存,這里看到了沒,這個(gè)的len就是字符串的長(zhǎng)度
str.getChars(off,
(off
+
len),
cbuf,
0);
write(cbuf,
0,
len);//向控制臺(tái)寫
}
}
就是說,你的java代碼在解析過程中就出現(xiàn)了錯(cuò)誤,具體錯(cuò)誤在文件結(jié)尾的位置,你是不是少寫了“}”?
用java的正則吧,具體代碼你搜一下就可以了,大概思路是包含數(shù)字開頭小數(shù)點(diǎn)什么的。
如果你曾經(jīng)用過Perl或任何其他內(nèi)建正則表達(dá)式支持的語(yǔ)言,你一定知道用正則表達(dá)式處理文本和匹配模式是多么簡(jiǎn)單。如果你不熟悉這個(gè)術(shù)語(yǔ),那么“正則表達(dá)式”(Regular Expression)就是一個(gè)字符構(gòu)成的串,它定義了一個(gè)用來搜索匹配字符串的模式。
許多語(yǔ)言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正則表達(dá)式處理文本,一些文本編輯器用正則表達(dá)式實(shí)現(xiàn)高級(jí)“搜索-替換”功能。那么Java又怎樣呢?本文寫作時(shí),一個(gè)包含了用正則表達(dá)式進(jìn)行文本處理的Java規(guī)范需求(Specification Request)已經(jīng)得到認(rèn)可,你可以期待在JDK的下一版本中看到它。
然而,如果現(xiàn)在就需要使用正則表達(dá)式,又該怎么辦呢?你可以從Apache.org下載源代碼開放的Jakarta-ORO庫(kù)。本文接下來的內(nèi)容先簡(jiǎn)要地介紹正則表達(dá)式的入門知識(shí),然后以Jakarta-ORO API為例介紹如何使用正則表達(dá)式。
一、正則表達(dá)式基礎(chǔ)知識(shí)
我們先從簡(jiǎn)單的開始。假設(shè)你要搜索一個(gè)包含字符“cat”的字符串,搜索用的正則表達(dá)式就是“cat”。如果搜索對(duì)大小寫不敏感,單詞“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是說:
1.1 句點(diǎn)符號(hào)
假設(shè)你在玩英文拼字游戲,想要找出三個(gè)字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結(jié)束。另外,假設(shè)有一本英文字典,你可以用正則表達(dá)式搜索它的全部?jī)?nèi)容。要構(gòu)造出這個(gè)正則表達(dá)式,你可以使用一個(gè)通配符——句點(diǎn)符號(hào)“.”。這樣,完整的表達(dá)式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t n”,還有其他許多無意義的組合。這是因?yàn)榫潼c(diǎn)符號(hào)匹配所有字符,包括空格、Tab字符甚至換行符:
1.2 方括號(hào)符號(hào)
為了解決句點(diǎn)符號(hào)匹配范圍過于廣泛這一問題,你可以在方括號(hào)(“[]”)里面指定看來有意義的字符。此時(shí),只有方括號(hào)里面指定的字符才參與匹配。也就是說,正則表達(dá)式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因?yàn)樵诜嚼ㄌ?hào)之內(nèi)你只能匹配單個(gè)字符:
1.3 “或”符號(hào)
如果除了上面匹配的所有單詞之外,你還想要匹配“toon”,那么,你可以使用“|”操作符?!皘”操作符的基本意義就是“或”運(yùn)算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正則表達(dá)式。這里不能使用方擴(kuò)號(hào),因?yàn)榉嚼ㄌ?hào)只允許匹配單個(gè)字符;這里必須使用圓括號(hào)“()”。圓括號(hào)還可以用來分組,具體請(qǐng)參見后面介紹。
1.4 表示匹配次數(shù)的符號(hào)
表一顯示了表示匹配次數(shù)的符號(hào),這些符號(hào)用來確定緊靠該符號(hào)左邊的符號(hào)出現(xiàn)的次數(shù):
假設(shè)我們要在文本文件中搜索美國(guó)的社會(huì)安全號(hào)碼。這個(gè)號(hào)碼的格式是999-99-9999。用來匹配它的正則表達(dá)式如圖一所示。在正則表達(dá)式中,連字符(“-”)有著特殊的意義,它表示一個(gè)范圍,比如從0到9。因此,匹配社會(huì)安全號(hào)碼中的連字符號(hào)時(shí),它的前面要加上一個(gè)轉(zhuǎn)義字符“\”。
圖一:匹配所有123-12-1234形式的社會(huì)安全號(hào)碼
假設(shè)進(jìn)行搜索的時(shí)候,你希望連字符號(hào)可以出現(xiàn),也可以不出現(xiàn)——即,999-99-9999和999999999都屬于正確的格式。這時(shí),你可以在連字符號(hào)后面加上“?”數(shù)量限定符號(hào),如圖二所示:
圖二:匹配所有123-12-1234和123121234形式的社會(huì)安全號(hào)碼
下面我們?cè)賮砜戳硗庖粋€(gè)例子。美國(guó)汽車牌照的一種格式是四個(gè)數(shù)字加上二個(gè)字母。它的正則表達(dá)式前面是數(shù)字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。圖三顯示了完整的正則表達(dá)式。
圖三:匹配典型的美國(guó)汽車牌照號(hào)碼,如8836KV
1.5 “否”符號(hào)
“^”符號(hào)稱為“否”符號(hào)。如果用在方括號(hào)內(nèi),“^”表示不想要匹配的字符。例如,圖四的正則表達(dá)式匹配所有單詞,但以“X”字母開頭的單詞除外。
圖四:匹配所有單詞,但“X”開頭的除外
1.6 圓括號(hào)和空白符號(hào)
假設(shè)要從格式為“June 26, 1951”的生日日期中提取出月份部分,用來匹配該日期的正則表達(dá)式可以如圖五所示:
圖五:匹配所有Moth DD,YYYY格式的日期
新出現(xiàn)的“\s”符號(hào)是空白符號(hào),匹配所有的空白字符,包括Tab字符。如果字符串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上一個(gè)圓括號(hào)創(chuàng)建一個(gè)組,然后用ORO API(本文后面詳細(xì)討論)提取出它的值。修改后的正則表達(dá)式如圖六所示:
圖六:匹配所有Month DD,YYYY格式的日期,定義月份值為第一個(gè)組
1.7 其它符號(hào)
為簡(jiǎn)便起見,你可以使用一些為常見正則表達(dá)式創(chuàng)建的快捷符號(hào)。如表二所示:
表二:常用符號(hào)
例如,在前面社會(huì)安全號(hào)碼的例子中,所有出現(xiàn)“[0-9]”的地方我們都可以使用“\d”。修改后的正則表達(dá)式如圖七所示:
圖七:匹配所有123-12-1234格式的社會(huì)安全號(hào)碼
二、Jakarta-ORO庫(kù)
有許多源代碼開放的正則表達(dá)式庫(kù)可供Java程序員使用,而且它們中的許多支持Perl 5兼容的正則表達(dá)式語(yǔ)法。我在這里選用的是Jakarta-ORO正則表達(dá)式庫(kù),它是最全面的正則表達(dá)式API之一,而且它與Perl 5正則表達(dá)式完全兼容。另外,它也是優(yōu)化得最好的API之一。
Jakarta-ORO庫(kù)以前叫做OROMatcher,Daniel Savarese大方地把它贈(zèng)送給了Jakarta Project。你可以按照本文最后參考資源的說明下載它。
我首先將簡(jiǎn)要介紹使用Jakarta-ORO庫(kù)時(shí)你必須創(chuàng)建和訪問的對(duì)象,然后介紹如何使用Jakarta-ORO API。
▲ PatternCompiler對(duì)象
首先,創(chuàng)建一個(gè)Perl5Compiler類的實(shí)例,并把它賦值給PatternCompiler接口對(duì)象。Perl5Compiler是PatternCompiler接口的一個(gè)實(shí)現(xiàn),允許你把正則表達(dá)式編譯成用來匹配的Pattern對(duì)象。
▲ Pattern對(duì)象
要把正則表達(dá)式編譯成Pattern對(duì)象,調(diào)用compiler對(duì)象的compile()方法,并在調(diào)用參數(shù)中指定正則表達(dá)式。例如,你可以按照下面這種方式編譯正則表達(dá)式“t[aeio]n”:
默認(rèn)情況下,編譯器創(chuàng)建一個(gè)大小寫敏感的模式(pattern)。因此,上面代碼編譯得到的模式只匹配“tin”、“tan”、 “ten”和“ton”,但不匹配“Tin”和“taN”。要?jiǎng)?chuàng)建一個(gè)大小寫不敏感的模式,你應(yīng)該在調(diào)用編譯器的時(shí)候指定一個(gè)額外的參數(shù):
創(chuàng)建好Pattern對(duì)象之后,你就可以通過PatternMatcher類用該P(yáng)attern對(duì)象進(jìn)行模式匹配。
▲ PatternMatcher對(duì)象
PatternMatcher對(duì)象根據(jù)Pattern對(duì)象和字符串進(jìn)行匹配檢查。你要實(shí)例化一個(gè)Perl5Matcher類并把結(jié)果賦值給PatternMatcher接口。Perl5Matcher類是PatternMatcher接口的一個(gè)實(shí)現(xiàn),它根據(jù)Perl 5正則表達(dá)式語(yǔ)法進(jìn)行模式匹配:
使用PatternMatcher對(duì)象,你可以用多個(gè)方法進(jìn)行匹配操作,這些方法的第一個(gè)參數(shù)都是需要根據(jù)正則表達(dá)式進(jìn)行匹配的字符串:
· boolean matches(String input, Pattern pattern):當(dāng)輸入字符串和正則表達(dá)式要精確匹配時(shí)使用。換句話說,正則表達(dá)式必須完整地描述輸入字符串。
· boolean matchesPrefix(String input, Pattern pattern):當(dāng)正則表達(dá)式匹配輸入字符串起始部分時(shí)使用。
· boolean contains(String input, Pattern pattern):當(dāng)正則表達(dá)式要匹配輸入字符串的一部分時(shí)使用(即,它必須是一個(gè)子串)。
另外,在上面三個(gè)方法調(diào)用中,你還可以用PatternMatcherInput對(duì)象作為參數(shù)替代String對(duì)象;這時(shí),你可以從字符串中最后一次匹配的位置開始繼續(xù)進(jìn)行匹配。當(dāng)字符串可能有多個(gè)子串匹配給定的正則表達(dá)式時(shí),用PatternMatcherInput對(duì)象作為參數(shù)就很有用了。用PatternMatcherInput對(duì)象作為參數(shù)替代String時(shí),上述三個(gè)方法的語(yǔ)法如下:
· boolean matches(PatternMatcherInput input, Pattern pattern)
· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
· boolean contains(PatternMatcherInput input, Pattern pattern)
三、應(yīng)用實(shí)例
下面我們來看看Jakarta-ORO庫(kù)的一些應(yīng)用實(shí)例。
3.1 日志文件處理
任務(wù):分析一個(gè)Web服務(wù)器日志文件,確定每一個(gè)用戶花在網(wǎng)站上的時(shí)間。在典型的BEA WebLogic日志文件中,日志記錄的格式如下:
分析這個(gè)日志記錄,可以發(fā)現(xiàn),要從這個(gè)日志文件提取的內(nèi)容有兩項(xiàng):IP地址和頁(yè)面訪問時(shí)間。你可以用分組符號(hào)(圓括號(hào))從日志記錄提取出IP地址和時(shí)間標(biāo)記。
首先我們來看看IP地址。IP地址有4個(gè)字節(jié)構(gòu)成,每一個(gè)字節(jié)的值在0到255之間,各個(gè)字節(jié)通過一個(gè)句點(diǎn)分隔。因此,IP地址中的每一個(gè)字節(jié)有至少一個(gè)、最多三個(gè)數(shù)字。圖八顯示了為IP地址編寫的正則表達(dá)式:
圖八:匹配IP地址
IP地址中的句點(diǎn)字符必須進(jìn)行轉(zhuǎn)義處理(前面加上“\”),因?yàn)镮P地址中的句點(diǎn)具有它本來的含義,而不是采用正則表達(dá)式語(yǔ)法中的特殊含義。句點(diǎn)在正則表達(dá)式中的特殊含義本文前面已經(jīng)介紹。
日志記錄的時(shí)間部分由一對(duì)方括號(hào)包圍。你可以按照如下思路提取出方括號(hào)里面的所有內(nèi)容:首先搜索起始方括號(hào)字符(“[”),提取出所有不超過結(jié)束方括號(hào)字符(“]”)的內(nèi)容,向前尋找直至找到結(jié)束方括號(hào)字符。圖九顯示了這部分的正則表達(dá)式。
圖九:匹配至少一個(gè)字符,直至找到“]”
現(xiàn)在,把上述兩個(gè)正則表達(dá)式加上分組符號(hào)(圓括號(hào))后合并成單個(gè)表達(dá)式,這樣就可以從日志記錄提取出IP地址和時(shí)間。注意,為了匹配“- -”(但不提取它),正則表達(dá)式中間加入了“\s-\s-\s”。完整的正則表達(dá)式如圖十所示。
圖十:匹配IP地址和時(shí)間標(biāo)記
現(xiàn)在正則表達(dá)式已經(jīng)編寫完畢,接下來可以編寫使用正則表達(dá)式庫(kù)的Java代碼了。
為使用Jakarta-ORO庫(kù),首先創(chuàng)建正則表達(dá)式字符串和待分析的日志記錄字符串:
這里使用的正則表達(dá)式與圖十的正則表達(dá)式差不多完全相同,但有一點(diǎn)例外:在Java中,你必須對(duì)每一個(gè)向前的斜杠(“\”)進(jìn)行轉(zhuǎn)義處理。圖十不是Java的表示形式,所以我們要在每個(gè)“\”前面加上一個(gè)“\”以免出現(xiàn)編譯錯(cuò)誤。遺憾的是,轉(zhuǎn)義處理過程很容易出現(xiàn)錯(cuò)誤,所以應(yīng)該小心謹(jǐn)慎。你可以首先輸入未經(jīng)轉(zhuǎn)義處理的正則表達(dá)式,然后從左到右依次把每一個(gè)“\”替換成“\\”。如果要復(fù)檢,你可以試著把它輸出到屏幕上。
初始化字符串之后,實(shí)例化PatternCompiler對(duì)象,用PatternCompiler編譯正則表達(dá)式創(chuàng)建一個(gè)Pattern對(duì)象:
現(xiàn)在,創(chuàng)建PatternMatcher對(duì)象,調(diào)用PatternMatcher接口的contain()方法檢查匹配情況:
接下來,利用PatternMatcher接口返回的MatchResult對(duì)象,輸出匹配的組。由于logEntry字符串包含匹配的內(nèi)容,你可以看到類如下面的輸出:
3.2 HTML處理實(shí)例一
下面一個(gè)任務(wù)是分析HTML頁(yè)面內(nèi)FONT標(biāo)記的所有屬性。HTML頁(yè)面內(nèi)典型的FONT標(biāo)記如下所示:
程序?qū)凑杖缦滦问?,輸出每一個(gè)FONT標(biāo)記的屬性:
在這種情況下,我建議你使用兩個(gè)正則表達(dá)式。第一個(gè)如圖十一所示,它從字體標(biāo)記提取出“"face="Arial, Serif" size="+2" color="red"”。
圖十一:匹配FONT標(biāo)記的所有屬性
第二個(gè)正則表達(dá)式如圖十二所示,它把各個(gè)屬性分割成名字-值對(duì)。
圖十二:匹配單個(gè)屬性,并把它分割成名字-值對(duì)
分割結(jié)果為:
現(xiàn)在我們來看看完成這個(gè)任務(wù)的Java代碼。首先創(chuàng)建兩個(gè)正則表達(dá)式字符串,用Perl5Compiler把它們編譯成Pattern對(duì)象。編譯正則表達(dá)式的時(shí)候,指定Perl5Compiler.CASE_INSENSITIVE_MASK選項(xiàng),使得匹配操作不區(qū)分大小寫。
接下來,創(chuàng)建一個(gè)執(zhí)行匹配操作的Perl5Matcher對(duì)象。
假設(shè)有一個(gè)String類型的變量html,它代表了HTML文件中的一行內(nèi)容。如果html字符串包含F(xiàn)ONT標(biāo)記,匹配器將返回true。此時(shí),你可以用匹配器對(duì)象返回的MatchResult對(duì)象獲得第一個(gè)組,它包含了FONT的所有屬性:
接下來創(chuàng)建一個(gè)PatternMatcherInput對(duì)象。這個(gè)對(duì)象允許你從最后一次匹配的位置開始繼續(xù)進(jìn)行匹配操作,因此,它很適合于提取FONT標(biāo)記內(nèi)屬性的名字-值對(duì)。創(chuàng)建PatternMatcherInput對(duì)象,以參數(shù)形式傳入待匹配的字符串。然后,用匹配器實(shí)例提取出每一個(gè)FONT的屬性。這通過指定PatternMatcherInput對(duì)象(而不是字符串對(duì)象)為參數(shù),反復(fù)地調(diào)用PatternMatcher對(duì)象的contains()方法完成。PatternMatcherInput對(duì)象之中的每一次迭代將把它內(nèi)部的指針向前移動(dòng),下一次檢測(cè)將從前一次匹配位置的后面開始。
本例的輸出結(jié)果如下:
3.3 HTML處理實(shí)例二
下面我們來看看另一個(gè)處理HTML的例子。這一次,我們假定Web服務(wù)器從widgets.acme.com移到了newserver.acme.com?,F(xiàn)在你要修改一些頁(yè)面中的鏈接:
執(zhí)行這個(gè)搜索的正則表達(dá)式如圖十三所示:
圖十三:匹配修改前的鏈接
如果能夠匹配這個(gè)正則表達(dá)式,你可以用下面的內(nèi)容替換圖十三的鏈接:
注意#字符的后面加上了$1。Perl正則表達(dá)式語(yǔ)法用$1、$2等表示已經(jīng)匹配且提取出來的組。圖十三的表達(dá)式把所有作為一個(gè)組匹配和提取出來的內(nèi)容附加到鏈接的后面。
現(xiàn)在,返回Java。就象前面我們所做的那樣,你必須創(chuàng)建測(cè)試字符串,創(chuàng)建把正則表達(dá)式編譯到Pattern對(duì)象所必需的對(duì)象,以及創(chuàng)建一個(gè)PatternMatcher對(duì)象:
接下來,用com.oroinc.text.regex包Util類的substitute()靜態(tài)方法進(jìn)行替換,輸出結(jié)果字符串:
Util.substitute()方法的語(yǔ)法如下:
這個(gè)調(diào)用的前兩個(gè)參數(shù)是以前創(chuàng)建的PatternMatcher和Pattern對(duì)象。第三個(gè)參數(shù)是一個(gè)Substiution對(duì)象,它決定了替換操作如何進(jìn)行。本例使用的是Perl5Substitution對(duì)象,它能夠進(jìn)行Perl5風(fēng)格的替換。第四個(gè)參數(shù)是想要進(jìn)行替換操作的字符串,最后一個(gè)參數(shù)允許指定是否替換模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替換指定的次數(shù)。
【結(jié)束語(yǔ)】在這篇文章中,我為你介紹了正則表達(dá)式的強(qiáng)大功能。只要正確運(yùn)用,正則表達(dá)式能夠在字符串提取和文本修改中起到很大的作用。另外,我還介紹了如何在Java程序中通過Jakarta-ORO庫(kù)利用正則表達(dá)式。至于最終采用老式的字符串處理方式(使用StringTokenizer,charAt,和substring),還是采用正則表達(dá)式,這就有待你自己決定了。
每條java語(yǔ)句都是以英文格式下的分號(hào)結(jié)束的,分號(hào)在英文里邊等于一個(gè)句號(hào).可以用來連接兩個(gè)完整的句子.
因?yàn)橛⑽牡木渥永镞吺侵髦^單一
Java學(xué)習(xí)之路:不走彎路,就是捷徑 (1)
作者: ∣來源:中國(guó)Java技術(shù)網(wǎng)∣原文地址∣2006-3-14
0.引言 在ChinaITLAB導(dǎo)師制輔導(dǎo)中,筆者發(fā)現(xiàn)問得最多的問題莫過于"如何學(xué)習(xí)編程?Java該如何學(xué)習(xí)?"。類似的問題回答多了,難免會(huì)感覺厭煩,就萌生了寫下本文的想法。到時(shí)候再有人問起類似的問題,我可以告訴他(她),請(qǐng)你去看看《Java學(xué)習(xí)之路》。拜讀過臺(tái)灣蔡學(xué)鏞先生的《Java夜未眠》,有些文章如《Java學(xué)習(xí)之道》等讓我們確實(shí)有共鳴,本文題目也由此而來。 軟件開發(fā)之路是充滿荊棘與挑戰(zhàn)之路,也是充滿希望之路。Java學(xué)習(xí)也是如此,沒有捷徑可走。夢(mèng)想像《天龍八部》中虛竹一樣被無崖子醍醐灌頂而輕松獲得一甲子功力,是很不現(xiàn)實(shí)的。每天仰天大叫"天神啊,請(qǐng)賜給我一本葵花寶典吧",殊不知即使你獲得了葵花寶典,除了受自宮其身之苦外,你也不一定成得了"東方不敗",倒是成"西方失敗"的幾率高一點(diǎn)。 "不走彎路,就是捷徑",佛經(jīng)說的不無道理。
1.如何學(xué)習(xí)程序設(shè)計(jì)? Java是一種平臺(tái),也是一種程序設(shè)計(jì)語(yǔ)言,如何學(xué)好程序設(shè)計(jì)不僅僅適用于Java,對(duì)C++等其他程序設(shè)計(jì)語(yǔ)言也一樣管用。有編程高手認(rèn)為,Java也好C也好沒什么分別,拿來就用。為什么他們能達(dá)到如此境界?我想是因?yàn)榫幊陶Z(yǔ)言之間有共通之處,領(lǐng)會(huì)了編程的精髓,自然能夠做到一通百通。如何學(xué)習(xí)程序設(shè)計(jì)理所當(dāng)然也有許多共通的地方。
1.1 培養(yǎng)興趣 興趣是能夠讓你堅(jiān)持下去的動(dòng)力。如果只是把寫程序作為謀生的手段的話,你會(huì)活的很累,也太對(duì)不起自己了。多關(guān)心一些行業(yè)趣事,多想想蓋茨。不是提倡天天做白日夢(mèng),但人要是沒有了夢(mèng)想,你覺得有味道嗎?可能像許多深圳本地農(nóng)民一樣,打打麻將,喝喝功夫茶,拜拜財(cái)神爺;每個(gè)月就有幾萬(wàn)十幾萬(wàn)甚至更多的進(jìn)帳,憑空多出個(gè)"食利階層"。你認(rèn)為,這樣有味道嗎?有空多到一些程序員論壇轉(zhuǎn)轉(zhuǎn),你會(huì)發(fā)現(xiàn),他們其實(shí)很樂觀幽默,時(shí)不時(shí)會(huì)冒出智慧的火花。
1.2 慎選程序設(shè)計(jì)語(yǔ)言 男怕入錯(cuò)行,女怕嫁錯(cuò)郎。初學(xué)者選擇程序設(shè)計(jì)語(yǔ)言需要謹(jǐn)慎對(duì)待。軟件開發(fā)不僅僅是掌握一門編程語(yǔ)言了事,它還需要其他很多方面的背景知識(shí)。軟件開發(fā)也不僅僅局限于某幾個(gè)領(lǐng)域,而是已經(jīng)滲透到了各行各業(yè)幾乎每一個(gè)角落。 如果你對(duì)硬件比較感興趣,你可以學(xué)習(xí)C語(yǔ)言/匯編語(yǔ)言,進(jìn)入硬件開發(fā)領(lǐng)域。如果你對(duì)電信的行業(yè)知識(shí)及網(wǎng)絡(luò)比較熟悉,你可以在C/C++等之上多花時(shí)間,以期進(jìn)入電信軟件開發(fā)領(lǐng)域。如果你對(duì)操作系統(tǒng)比較熟悉,你可以學(xué)習(xí)C/Linux等等,為L(zhǎng)inux內(nèi)核開發(fā)/驅(qū)動(dòng)程序開發(fā)/嵌入式開發(fā)打基礎(chǔ)。 如果你想介入到應(yīng)用范圍最廣泛的應(yīng)用軟件開發(fā)(包括電子商務(wù)電子政務(wù)系統(tǒng))的話,你可以選擇J2EE或.NET,甚至LAMP組合。每個(gè)領(lǐng)域要求的背景知識(shí)不一樣。做應(yīng)用軟件需要對(duì)數(shù)據(jù)庫(kù)等很熟悉??傊?,你需要根據(jù)自己的特點(diǎn)來選擇合適你的編程語(yǔ)言。
1.3 要腳踏實(shí)地,快餐式的學(xué)習(xí)不可取 先分享一個(gè)故事。 有一個(gè)小朋友,他很喜歡研究生物學(xué),很想知道那些蝴蝶如何從蛹?xì)だ锍鰜?,變成蝴蝶便?huì)飛。有一次,他走到草原上面看見一個(gè)蛹,便取了回家,然后看著,過了幾天以后,這個(gè)蛹出了一條裂痕,看見里面的蝴蝶開始掙扎,想抓破蛹?xì)わw出來。 這個(gè)過程達(dá)數(shù)小時(shí)之久,蝴蝶在蛹里面很辛苦地拼命掙扎,怎么也沒法子走出來。這個(gè)小孩看著看著不忍心,就想不如讓我?guī)蛶退?,便隨手拿起剪刀在蛹上剪開,使蝴蝶破蛹而出。 但蝴蝶出來以后,因?yàn)槌岚虿粔蛄?,變得很臃腫,飛不起來。 這個(gè)故事給我們的啟示是:欲速則不達(dá)。 浮躁是現(xiàn)代人最普遍的心態(tài),能怪誰(shuí)?也許是貧窮落后了這么多年的緣故,就像當(dāng)年的大躍進(jìn)一樣,都想大步跨入共產(chǎn)主義社會(huì)?,F(xiàn)在的軟件公司、客戶、政府、學(xué)校、培訓(xùn)機(jī)構(gòu)等等到處彌漫著浮躁之氣。就拿筆者比較熟悉的深圳IT培訓(xùn)行業(yè)來說吧,居然有的打廣告宣稱"參加培訓(xùn),100%就業(yè)",居然報(bào)名的學(xué)生不少,簡(jiǎn)直是藐視天下程序員。社會(huì)環(huán)境如是,我們不能改變,只能改變自己,鬧市中的安寧,彌足珍貴。許多初學(xué)者C++/Java沒開始學(xué),立馬使用VC/JBuilder,會(huì)使用VC/JBuilder開發(fā)一個(gè)Hello World程序,就忙不迭的向世界宣告,"我會(huì)軟件開發(fā)了",簡(jiǎn)歷上也大言不慚地寫上"精通VC/Java"。結(jié)果到軟件公司面試時(shí)要么被三兩下打發(fā)走了,要么被駁的體無完膚,無地自容。到處碰壁之后才知道捧起《C++編程思想》《Java編程思想》仔細(xì)鉆研,早知如此何必當(dāng)初呀。 "你現(xiàn)在講究簡(jiǎn)單方便,你以后的路就長(zhǎng)了",好象也是佛經(jīng)中的勸戒。
1.4 多實(shí)踐,快實(shí)踐 彭端淑的《為學(xué)一首示子侄》中有窮和尚與富和尚的故事。 從前,四川邊境有兩個(gè)和尚,一個(gè)貧窮,一個(gè)有錢。一天,窮和尚對(duì)富和尚說:"我打算去南海朝圣,你看怎么樣?"富和尚說:"這里離南海有幾千里遠(yuǎn),你靠什么去呢?"窮和尚說:"我只要一個(gè)水缽,一個(gè)飯碗就夠了。"富和尚為難地說:"幾年前我就打算買條船去南海,可至今沒去成,你還是別去吧!" 一年以后,富和尚還在為租賃船只籌錢,窮和尚卻已經(jīng)從南海朝圣回來了。 這個(gè)故事可解讀為:任何事情,一旦考慮好了,就要馬上上路,不要等到準(zhǔn)備周全之后,再去干事情。假如事情準(zhǔn)備考慮周全了再上路的話,別人恐怕捷足先登了。軟件開發(fā)是一門工程學(xué)科,注重的就是實(shí)踐,"君子動(dòng)口不動(dòng)手"對(duì)軟件開發(fā)人員來講根本就是錯(cuò)誤的,他們提倡"動(dòng)手至上",但別害怕,他們大多溫文爾雅,沒有暴力傾向,雖然有時(shí)候蓬頭垢面的一副"比爾蓋茨"樣。有前輩高人認(rèn)為,學(xué)習(xí)編程的秘訣是:編程、編程、再編程,筆者深表贊同。不僅要多實(shí)踐,而且要快實(shí)踐。我們?cè)诳磿臅r(shí)候,不要等到你完全理解了才動(dòng)手敲代碼,而是應(yīng)該在看書的同時(shí)敲代碼,程序運(yùn)行的各種情況可以讓你更快更牢固的掌握知識(shí)點(diǎn)。
1.5 多參考程序代碼 程序代碼是軟件開發(fā)最重要的成果之一,其中滲透了程序員的思想與靈魂。許多人被《仙劍奇?zhèn)b傳》中凄美的愛情故事感動(dòng),悲劇的結(jié)局更有一種缺憾美。為什么要以悲劇結(jié)尾?據(jù)說是因?yàn)閷憽断蓜ζ鎮(zhèn)b傳》的程序員失戀而安排了這樣的結(jié)局,他把自己的感覺融入到游戲中,卻讓眾多的仙劍迷扼腕嘆息。 多多參考代碼例子,對(duì)Java而言有參考文獻(xiàn)[4.3],有API類的源代碼(JDK安裝目錄下的src.zip文件),也可以研究一些開源的軟件或框架。
1.6 加強(qiáng)英文閱讀能力 對(duì)學(xué)習(xí)編程來說,不要求英語(yǔ), 但不能一點(diǎn)不會(huì),。最起碼像Java API文檔(參考文獻(xiàn)[4.4])這些東西還是要能看懂的,連猜帶懵都可以;旁邊再開啟一個(gè)"金山詞霸"??炊嗔司蜁?huì)越來越熟練。在學(xué)Java的同時(shí)學(xué)習(xí)英文,一箭雙雕多好。另外好多軟件需要到英文網(wǎng)站下載,你要能夠找到它們,這些是最基本的要求。英語(yǔ)好對(duì)你學(xué)習(xí)有很大的幫助??谡Z(yǔ)好的話更有機(jī)會(huì)進(jìn)入管理層,進(jìn)而可以成為剝削程序員的"周扒皮"。
1.7 萬(wàn)不得已才請(qǐng)教別人 筆者在ChinaITLab網(wǎng)校的在線輔導(dǎo)系統(tǒng)中解決學(xué)生問題時(shí)發(fā)現(xiàn),大部分的問題學(xué)生稍做思考就可以解決。請(qǐng)教別人之前,你應(yīng)該先回答如下幾個(gè)問題。 你是否在google中搜索了問題的解決辦法? 你是否查看了Java API文檔? 你是否查找過相關(guān)書籍? 你是否寫代碼測(cè)試過? 如果回答都是"是"的話,而且還沒有找到解決辦法,再問別人不遲。要知道獨(dú)立思考的能力對(duì)你很重要。要知道程序員的時(shí)間是很寶貴的。
1.8 多讀好書 書中自有顏如玉。比爾?蓋茨是一個(gè)飽讀群書的人。雖然沒有讀完大學(xué),但九歲的時(shí)候比爾?蓋茨就已經(jīng)讀完了所有的百科全書,所以他精通天文、歷史、地理等等各類學(xué)科,可以說比爾?蓋茨不僅是當(dāng)今世界上金錢的首富,而且也可以稱得上是知識(shí)的巨富。 筆者在給學(xué)生上課的時(shí)候經(jīng)常會(huì)給他們推薦書籍,到后來學(xué)生實(shí)在忍無可忍開始抱怨,"天吶,這么多書到什么時(shí)候才能看完了","學(xué)軟件開發(fā),感覺上了賊船"。這時(shí)候,我的回答一般是,"別著急,什么時(shí)候帶你們?nèi)タ纯次业臅?,到現(xiàn)在每月花在技術(shù)書籍上的錢400元,這在軟件開發(fā)人員之中還只能夠算是中等的",學(xué)生當(dāng)場(chǎng)暈倒。(注:這一部分學(xué)生是剛學(xué)軟件開發(fā)的) 對(duì)于在Java開發(fā)領(lǐng)域的好書在筆者另外一篇文章中會(huì)專門點(diǎn)評(píng)。該文章可作為本文的姊妹篇。
1.9 使用合適的工具 工欲善其事必先利其器。軟件開發(fā)包含各種各樣的活動(dòng),需求收集分析、建立用例模型、建立分析設(shè)計(jì)模型、編程實(shí)現(xiàn)、調(diào)試程序、自動(dòng)化測(cè)試、持續(xù)集成等等,沒有工具幫忙可以說是寸步難行。工具可以提高開發(fā)效率,使軟件的質(zhì)量更高BUG更少。組合稱手的武器。到飛花摘葉皆可傷人的境界就很高了,無招勝有招,手中無劍心中有劍這樣的境界幾乎不可企及。在筆者另外一篇文章中會(huì)專門闡述如何選擇合適的工具(該文章也可作為本文的姊妹篇)。
2.軟件開發(fā)學(xué)習(xí)路線 兩千多年的儒家思想孔孟之道,中庸的思想透入骨髓,既不冒進(jìn)也不保守并非中庸之道,而是找尋學(xué)習(xí)軟件開發(fā)的正確路線與規(guī)律。 從軟件開發(fā)人員的生涯規(guī)劃來講,我們可以大致分為三個(gè)階段,軟件工程師→軟件設(shè)計(jì)師→架構(gòu)設(shè)計(jì)師或項(xiàng)目管理師。不想當(dāng)元帥的士兵不是好士兵,不想當(dāng)架構(gòu)設(shè)計(jì)師或項(xiàng)目管理師的程序員也不是好的程序員。我們應(yīng)該努力往上走。讓我們先整理一下開發(fā)應(yīng)用軟件需要學(xué)習(xí)的主要技術(shù)。
A.基礎(chǔ)理論知識(shí),如操作系統(tǒng)、編譯原理、數(shù)據(jù)結(jié)構(gòu)與算法、計(jì)算機(jī)原理等,它們并非不重要。如不想成為計(jì)算機(jī)科學(xué)家的話,可以采取"用到的時(shí)候再來學(xué)"的原則。
B.一門編程語(yǔ)言,現(xiàn)在基本上都是面向?qū)ο蟮恼Z(yǔ)言,Java/C++/C#等等。如果做WEB開發(fā)的話還要學(xué)習(xí)HTML/JavaScript等等。
C.一種方法學(xué)或者說思想,現(xiàn)在基本都是面向?qū)ο笏枷耄∣OA/OOD/設(shè)計(jì)模式)。由此而衍生的基于組件開發(fā)CBD/面向方面編程AOP等等。
D.一種關(guān)系型數(shù)據(jù)庫(kù),ORACLE/SqlServer/DB2/MySQL等等
E.一種提高生產(chǎn)率的IDE集成開發(fā)環(huán)境JBuilder/Eclipse/VS.NET等。
F.一種UML建模工具,用ROSE/VISIO/鋼筆進(jìn)行建模。
G.一種軟件過程,RUP/XP/CMM等等,通過軟件過程來組織軟件開發(fā)的眾多活動(dòng),使開發(fā)流程專業(yè)化規(guī)范化。當(dāng)然還有其他的一些軟件工程知識(shí)。
H.項(xiàng)目管理、體系結(jié)構(gòu)、框架知識(shí)。
正確的路線應(yīng)該是:B→C→E→F→G→H。 還需要補(bǔ)充幾點(diǎn):
1).對(duì)于A與C要補(bǔ)充的是,我們應(yīng)該在實(shí)踐中逐步領(lǐng)悟編程理論與編程思想。新技術(shù)雖然不斷涌現(xiàn),更新速度令人眼花燎亂霧里看花;但萬(wàn)變不離其宗,編程理論與編程思想的變化卻很慢。掌握了編程理論與編程思想你就會(huì)有撥云見日之感。面向?qū)ο蟮乃枷朐谀壳皝碇v是相當(dāng)關(guān)鍵的,是強(qiáng)勢(shì)技術(shù)之一,在上面需要多投入時(shí)間,給你的回報(bào)也會(huì)讓你驚喜。
2).對(duì)于數(shù)據(jù)庫(kù)來說是獨(dú)立學(xué)習(xí)的,這個(gè)時(shí)機(jī)就由你來決定吧。
3).編程語(yǔ)言作為學(xué)習(xí)軟件開發(fā)的主線,而其余的作為輔線。
4).軟件工程師著重于B、C、E、D;軟件設(shè)計(jì)師著重于B、C、E、D、F;架構(gòu)設(shè)計(jì)師著重于C、F、H。
3.如何學(xué)習(xí)Java?
3.1 Java學(xué)習(xí)路線
3.1.1 基礎(chǔ)語(yǔ)法及Java原理 基礎(chǔ)語(yǔ)法和Java原理是地基,地基不牢靠,猶如沙地上建摩天大廈,是相當(dāng)危險(xiǎn)的。學(xué)習(xí)Java也是如此,必須要有扎實(shí)的基礎(chǔ),你才能在J2EE、J2ME領(lǐng)域游刃有余。參加SCJP(SUN公司認(rèn)證的Java程序員)考試不失為一個(gè)好方法,原因之一是為了對(duì)得起你交的1200大洋考試費(fèi),你會(huì)更努力學(xué)習(xí),原因之二是SCJP考試能夠讓你把基礎(chǔ)打得很牢靠,它要求你跟JDK一樣熟悉Java基礎(chǔ)知識(shí);但是你千萬(wàn)不要認(rèn)為考過了SCJP就有多了不起,就能夠獲得軟件公司的青睞,就能夠獲取高薪,這樣的想法也是很危險(xiǎn)的。獲得"真正"的SCJP只能證明你的基礎(chǔ)還過得去,但離實(shí)際開發(fā)還有很長(zhǎng)的一段路要走。
3.1.2 OO思想的領(lǐng)悟 掌握了基礎(chǔ)語(yǔ)法和Java程序運(yùn)行原理后,我們就可以用Java語(yǔ)言實(shí)現(xiàn)面向?qū)ο蟮乃枷肓?。面向?qū)ο?,是一種方法學(xué);是獨(dú)立于語(yǔ)言之外的編程思想;是CBD基于組件開發(fā)的基礎(chǔ);屬于強(qiáng)勢(shì)技術(shù)之一。當(dāng)以后因工作需要轉(zhuǎn)到別的面向?qū)ο笳Z(yǔ)言的時(shí)候,你會(huì)感到特別的熟悉親切,學(xué)起來像喝涼水這么簡(jiǎn)單。
使用面向?qū)ο蟮乃枷脒M(jìn)行開發(fā)的基本過程是:
●調(diào)查收集需求。
●建立用例模型。
●從用例模型中識(shí)別分析類及類與類之間的靜態(tài)動(dòng)態(tài)關(guān)系,從而建立分析模型。
●細(xì)化分析模型到設(shè)計(jì)模型。
●用具體的技術(shù)去實(shí)現(xiàn)。
●測(cè)試、部署、總結(jié)。
3.1.3 基本API的學(xué)習(xí) 進(jìn)行軟件開發(fā)的時(shí)候,并不是什么功能都需要我們?nèi)?shí)現(xiàn),也就是經(jīng)典名言所說的"不需要重新發(fā)明輪子"。我們可以利用現(xiàn)成的類、組件、框架來搭建我們的應(yīng)用,如SUN公司編寫好了眾多類實(shí)現(xiàn)一些底層功能,以及我們下載過來的JAR文件中包含的類,我們可以調(diào)用類中的方法來完成某些功能或繼承它。那么這些類中究竟提供了哪些方法給我們使用?方法的參數(shù)個(gè)數(shù)及類型是?類的構(gòu)造器需不需要參數(shù)?總不可能SUN公司的工程師打國(guó)際長(zhǎng)途甚至飄洋過海來告訴你他編寫的類該如何使用吧。他們只能提供文檔給我們查看,Java DOC文檔(參考文獻(xiàn)4.4)就是這樣的文檔,它可以說是程序員與程序員交流的文檔。 基本API指的是實(shí)現(xiàn)了一些底層功能的類,通用性較強(qiáng)的API,如字符串處理/輸入輸出等等。我們又把它成為類庫(kù)。熟悉API的方法一是多查Java DOC文檔(參考文獻(xiàn)4.4),二是使用JBuilder/Eclipse等IDE的代碼提示功能。
3.1.4 特定API的學(xué)習(xí) Java介入的領(lǐng)域很廣泛,不同的領(lǐng)域有不同的API,沒有人熟悉所有的API,對(duì)一般人而言只是熟悉工作中要用到的API。如果你做界面開發(fā),那么你需要學(xué)習(xí)Swing/AWT/SWT等API;如果你進(jìn)行網(wǎng)絡(luò)游戲開發(fā),你需要深入了解網(wǎng)絡(luò)API/多媒體API/2D3D等;如果你做WEB開發(fā),就需要熟 悉Servlet等API啦??傊?,需要根據(jù)工作的需要或你的興趣發(fā)展方向去選擇學(xué)習(xí)特定的API。
3.1.5 開發(fā)工具的用法 在學(xué)習(xí)基礎(chǔ)語(yǔ)法與基本的面向?qū)ο蟾拍顣r(shí),從鍛煉語(yǔ)言熟練程度的角度考慮,我們推薦使用的工具是Editplus/JCreator+JDK,這時(shí)候不要急于上手JBuilder/Eclipse等集成開發(fā)環(huán)境,以免過于關(guān)注IDE的強(qiáng)大功能而分散對(duì)Java技術(shù)本身的注意力。過了這一階段你就可以開始熟悉IDE了。 程序員日常工作包括很多活動(dòng),編輯、編譯及構(gòu)建、調(diào)試、單元測(cè)試、版本控制、維持模型與代碼同步、文檔的更新等等,幾乎每一項(xiàng)活動(dòng)都有專門的工具,如果獨(dú)立使用這些工具的話,你將會(huì)很痛苦,你需要在堆滿工具的任務(wù)欄上不斷的切換,效率很低下,也很容易出錯(cuò)。在JBuilder、Eclipse等IDE中已經(jīng)自動(dòng)集成編輯器、編譯器、調(diào)試器、單元測(cè)試工具JUnit、自動(dòng)構(gòu)建工具ANT、版本控制工具CVS、DOC文檔生成與更新等等,甚至可以把UML建模工具也集成進(jìn)去,又提供了豐富的向?qū)椭煽蚣艽a,讓我們的開發(fā)變得更輕松。應(yīng)該說IDE發(fā)展的趨勢(shì)就是集成軟件開發(fā)中要用到的幾乎所有工具。 從開發(fā)效率的角度考慮,使用IDE是必經(jīng)之路,也是從一個(gè)學(xué)生到一個(gè)職業(yè)程序員轉(zhuǎn)變的里程碑。 Java開發(fā)使用的IDE主要有Eclipse、JBuilder、JDeveloper、NetBeans等幾種;而Eclipse、JBuilder占有的市場(chǎng)份額是最大的。JBuilder在近幾年來一直是Java集成開發(fā)環(huán)境中的霸主,它是由備受程序員尊敬的Borland公司開發(fā),在硝煙彌漫的Java IDE大戰(zhàn)中,以其快速的版本更新?lián)魯BM的Visual Age for Java等而成就一番偉業(yè)。IBM在Visual Age for Java上已經(jīng)無利可圖之下,干脆將之貢獻(xiàn)給開源社區(qū),成為Eclipse的前身,真所謂"柳暗花明又一村"。浴火重生的Eclipse以其開放式的插件擴(kuò)展機(jī)制、免費(fèi)開源獲得廣大程序員(包括幾乎所有的骨灰級(jí)程序員)的青睞,極具發(fā)展?jié)摿Α?/p>
3.1.6 學(xué)習(xí)軟件工程 對(duì)小型項(xiàng)目而言,你可能認(rèn)為軟件工程沒太大的必要。隨著項(xiàng)目的復(fù)雜性越來越高,軟件工程的必要性才會(huì)體現(xiàn)出來。參見"軟件開發(fā)學(xué)習(xí)路線"小節(jié)。
3.2學(xué)習(xí)要點(diǎn) 確立的學(xué)習(xí)路線之后,我們還需要總結(jié)一下Java的學(xué)習(xí)要點(diǎn),這些要點(diǎn)在前文多多少少提到過,只是筆者覺得這些地方特別要注意才對(duì)它們進(jìn)行匯總,不要嫌我婆婆媽媽啊。
3.2.1勤查API文檔 當(dāng)程序員編寫好某些類,覺得很有成就感,想把它貢獻(xiàn)給各位苦難的同行。這時(shí)候你要使用"Javadoc"工具(包含在JDK中)生成標(biāo)準(zhǔn)的Java DOC文檔,供同行使用。J2SE/J2EE/J2ME的DOC文檔是程序員與程序員交流的工具,幾乎人手一份,除了菜鳥之外。J2SE DOC文檔官方下載地址:,你可以到google搜索CHM版本下載。也可以在線查看:。 對(duì)待DOC文檔要像毛主席語(yǔ)錄,早上起床念一遍,吃飯睡覺前念一遍。 當(dāng)需要某項(xiàng)功能的時(shí)候,你應(yīng)該先查相應(yīng)的DOC文檔看看有沒有現(xiàn)成的實(shí)現(xiàn),有的話就不必勞神費(fèi)心了直接用就可以了,找不到的時(shí)候才考慮自己實(shí)現(xiàn)。使用步驟一般如下: ●找特定的包,包一般根據(jù)功能組織。 ●找需要使用類,類命名規(guī)范的話我們由類的名字可猜出一二。 ●選擇構(gòu)造器,大多數(shù)使用類的方式是創(chuàng)建對(duì)象。 ●選擇你需要的方法。
3.2.2 查書/google-寫代碼測(cè)試-查看源代碼-請(qǐng)教別人 當(dāng)我們遇到問題的時(shí)候該如何解決? 這時(shí)候不要急著問別人,太簡(jiǎn)單的問題,沒經(jīng)過思考的問題,別人會(huì)因此而瞧不起你??梢韵日艺視?,到google中搜一下看看,絕大部分問題基本就解決了。而像"某些類/方法如何使用的問題",DOC文檔就是答案。對(duì)某些知識(shí)點(diǎn)有疑惑是,寫代碼測(cè)試一下,會(huì)給你留下深刻的印象。而有的問題,你可能需要直接看API的源代碼驗(yàn)證你的想法。萬(wàn)不得已才去請(qǐng)教別人。
3.2.3學(xué)習(xí)開源軟件的設(shè)計(jì)思想 Java領(lǐng)域有許多源代碼開放的工具、組件、框架,JUnit、ANT、Tomcat、Struts、Spring、Jive論壇、PetStore寵物店等等多如牛毛。這些可是前輩給我們留下的瑰寶呀。入寶山而空手歸,你心甘嗎?對(duì)這些工具、框架進(jìn)行分析,領(lǐng)會(huì)其中的設(shè)計(jì)思想,有朝一日說不定你也能寫一個(gè)XXX框架什么的,風(fēng)光一把。分析開源軟件其實(shí)是你提高技術(shù)、提高實(shí)戰(zhàn)能力的便捷方法。
3.2.4 規(guī)范的重要性 沒有規(guī)矩,不成方圓。這里的規(guī)范有兩層含義。第一層含義是技術(shù)規(guī)范,多到下載JSRXXX規(guī)范,多讀規(guī)范,這是最權(quán)威準(zhǔn)確最新的教材。第二層含義是編程規(guī)范,如果你使用了大量的獨(dú)特算法,富有個(gè)性的變量及方法的命名方式;同時(shí),沒給程序作注釋,以顯示你的編程功底是多么的深厚。這樣的代碼別人看起來像天書,要理解談何容易,更不用說維護(hù)了,必然會(huì)被無情地掃入垃圾堆。Java編碼規(guī)范到此查看或下載,中文的也有,啊,還要問我在哪,請(qǐng)參考3.2.2節(jié)。
3.2.5 不局限于Java 很不幸,很幸運(yùn),要學(xué)習(xí)的東西還有很多。不幸的是因?yàn)橐獙W(xué)的東西太多且多變,沒時(shí)間陪老婆家人或女朋友,導(dǎo)致身心疲憊,嚴(yán)重者甚至導(dǎo)致抑郁癥。幸運(yùn)的是別人要搶你飯碗絕非易事,他們或她們需要付出很多才能達(dá)成心愿。 Java不要孤立地去學(xué)習(xí),需要綜合學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)、OOP、軟件工程、UML、網(wǎng)絡(luò)編程、數(shù)據(jù)庫(kù)技術(shù)等知識(shí),用橫向縱向的比較聯(lián)想的方式去學(xué)習(xí)會(huì)更有效。如學(xué)習(xí)Java集合的時(shí)候找數(shù)據(jù)結(jié)構(gòu)的書看看;學(xué)JDBC的時(shí)候復(fù)習(xí)數(shù)據(jù)庫(kù)技術(shù);采取的依然是"需要的時(shí)候再學(xué)"的原則。
4.結(jié)束語(yǔ) 需要強(qiáng)調(diào)的是,學(xué)習(xí)軟件開發(fā)確實(shí)有一定的難度,也很辛苦,需要付出很多努力,但千萬(wàn)不要半途而廢。本文如果能對(duì)一直徘徊在Java神殿之外的朋友有所幫助的話,筆者也欣慰了。哈哈,怎么聽起來老氣橫秋呀?沒辦法,在電腦的長(zhǎng)期輻射之下,都快變成小老頭了。最后奉勸各位程序員尤其是MM程序員,完成工作后趕快遠(yuǎn)離電腦,據(jù)《胡播亂報(bào)》報(bào)道,電腦輻射會(huì)在白皙的皮膚上面點(diǎn)綴一些小黑點(diǎn),看起來鮮艷無比…… (轉(zhuǎn)載文章請(qǐng)保留出處:Java家())
新聞名稱:java代碼結(jié)束語(yǔ),java中結(jié)束程序語(yǔ)句
網(wǎng)站路徑:http://chinadenli.net/article8/hoheip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、品牌網(wǎng)站制作、虛擬主機(jī)、關(guān)鍵詞優(yōu)化、網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)