JAVA更多的類謎題75:頭還是尾_第1頁(yè)
JAVA更多的類謎題75:頭還是尾_第2頁(yè)
JAVA更多的類謎題75:頭還是尾_第3頁(yè)
JAVA更多的類謎題75:頭還是尾_第4頁(yè)
JAVA更多的類謎題75:頭還是尾_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論