下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
JAVA更多的類謎題75:頭還是尾importjava.util.Random;
publicclassCoinSide{
privatestaticRandomrnd=newRandom();
publicstaticCoinSideflip(){
returnrnd.nextBoolean()?
Heads.INSTANCE:Tails.INSTANCE;
}
publicstaticvoidmain(String[]args){
System.out.println(flip());
}
}
classHeadsextendsCoinSide{
privateHeads(){}
publicstaticfinalHeadsINSTANCE=newHeads();
publicStringtoString(){
return“heads“;
}
}
classTailsextendsCoinSide{
privateTails(){}
publicstaticfinalTailsINSTANCE=newTails();
publicStringtoString(){
return“tails“;
}
}
該程序看起來(lái)根本沒有使用5.0版的任何新特性,因此很難看出來(lái)為什么它們?cè)谛袨樯蠎?yīng)當(dāng)有差異。事實(shí)上,該程序在1.4或更早版本的平臺(tái)上是不能編譯的:
CoinSide.java:7:
incompatibletypesfor?:neitherisasubtypeoftheother
secondoperand:Heads
thirdoperand:Tails
returnrnd.nextBoolean()?
^
條件操作符(?:)的行為在5.0版本之前是特別受限的[JLS215.25]。當(dāng)其次個(gè)和第三個(gè)操作數(shù)是引用類型時(shí),條件操作符要求它們其中的一個(gè)必需是另一個(gè)的子類型。Heads和Tails彼此都不是對(duì)方的子類型,所以這里就產(chǎn)生了一個(gè)錯(cuò)誤。為了讓這段代碼能夠編譯,你可以將其中一個(gè)操作數(shù)轉(zhuǎn)型為二者的公共超類:
returnrnd.nextBooleam()?
(CoinSide)Heads.INSTANCE:Tails.INSTANCE;
在5.0或更新的版本中,Java語(yǔ)言顯得更加寬大了,條件操作符在其次個(gè)和第三個(gè)操作數(shù)是引用類型時(shí)總是合法的。其結(jié)果類型是這兩種類型的最小公共超類。公共超類總是存在的,由于Object是每一個(gè)對(duì)象類型的超類型。在實(shí)際使用中,這種變化的主要結(jié)果就是條件操作符做正確的事情的狀況更多了,而給出編譯期錯(cuò)誤的狀況更少了。對(duì)于我們當(dāng)中的語(yǔ)言菜鳥來(lái)說(shuō),作用于引用類型的條件操作符的結(jié)果所具備的編譯期類型與在其次個(gè)和第三個(gè)操作數(shù)上調(diào)用下面的方法的結(jié)果一樣:
Tchoose(Ta,Tb){}
本謎題所展現(xiàn)的問題在1.4和更早的版本中發(fā)生得相當(dāng)頻繁,迫使你必需插入只是為了遮掩你的代碼的真實(shí)目的而進(jìn)展的轉(zhuǎn)型。這就是說(shuō),該謎題本身是人為制造的。在5.0版本之前,使用類型安全的枚舉模式來(lái)編寫CoinSide對(duì)程序員來(lái)說(shuō)會(huì)顯得更自然一些[EJItem21]:
下面的程序全部是由同步化(synchronized)的靜態(tài)方法組成的。那么它會(huì)打印出什么呢?在你每次運(yùn)行這段程序的時(shí)候,它都能保證會(huì)打印出一樣的內(nèi)容嗎?
publicclassPingPong{
publicstaticsynchronizedvoidmain(String[]a){
Threadt=newThread(){
publicvoidrun(){pong();}
};
t.run();
System.out.print(“Ping“);
}
staticsynchronizedvoidpong(){
System.out.print(“Pong“);
}
}
在多線程程序中,通常正確的觀點(diǎn)是程序每次運(yùn)行的結(jié)果都有可能發(fā)生變化,但是上面這段程序總是打印出一樣的內(nèi)容。在一個(gè)同步化的靜態(tài)方法執(zhí)行之前,它會(huì)獵取與它的Class對(duì)象相關(guān)聯(lián)的一個(gè)管程(monitor)鎖[JLS8.4.3.6]。所以在上面的程序中,主線程會(huì)在創(chuàng)立其次個(gè)線程之前獲得與PingPong.class相關(guān)聯(lián)的那個(gè)鎖。只要主線程占有著這個(gè)鎖,其次個(gè)線程就不行能執(zhí)行同步化的靜態(tài)方法。詳細(xì)地講,在main方法打印了Ping并且執(zhí)行完畢之后,其次個(gè)線程才能執(zhí)行pong方法。只有當(dāng)主線程放棄
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 交安工程施工方案
- 住宅樓室內(nèi)裝修維修改造工程施工方案
- 2.3用算法解決問題的過程 第3課時(shí)(分層作業(yè))
- 惠民縣2025屆數(shù)學(xué)六年級(jí)第一學(xué)期期末達(dá)標(biāo)檢測(cè)試題含解析
- 山西省大同市陽(yáng)高縣第二中學(xué)校2024-2025學(xué)年九年級(jí)上學(xué)期10月月考物理試題(無(wú)答案)
- 2024年新人教版七年級(jí)上冊(cè)數(shù)學(xué)教學(xué)課件 4.2 第2課時(shí) 去括號(hào)
- 2024年河南省南陽(yáng)市宛城二十三中小升初數(shù)學(xué)試卷
- 人力資源政策對(duì)IT行業(yè)技術(shù)創(chuàng)新人才激勵(lì)影響的研究
- 無(wú)人機(jī)操控技術(shù)課件:接收機(jī)的設(shè)置
- 汽車區(qū)域車展運(yùn)營(yíng)方案
- 20以內(nèi)加減法練習(xí)
- 改革開放以來(lái)商品零售價(jià)格指數(shù)(RPI)
- 國(guó)家電網(wǎng)公司配電網(wǎng)工程典型設(shè)計(jì)
- Reporting_template_to_headquarter上市公司海外子公司財(cái)務(wù)報(bào)表模板(中英文對(duì)照)
- UL982中文版[共77頁(yè)]
- (公開課課件)六年級(jí)上冊(cè)數(shù)學(xué) 求一個(gè)數(shù)多(少)幾分之幾是多少的實(shí)際問題- (共22張PPT)
- 石油鉆桿接頭螺紋.doc
- 軟母線安裝施工方案
- 歐陸直流調(diào)速器調(diào)試步驟
- 公安局上半年績(jī)效積分考核工作總結(jié)
- 空氣動(dòng)力學(xué):空氣動(dòng)力學(xué)作業(yè)(第二章)
評(píng)論
0/150
提交評(píng)論