類謎題 關於靜態域的乙個小問題

2021-06-02 14:04:01 字數 1876 閱讀 2703

知識點:靜態與只有乙個,沒有拷貝,是共享的。

第二個:關於使用整合還是組合。

下面的程式使用了乙個counter類來跟蹤每一種家庭寵物叫喚的次數。那麼該程式會列印出什麼呢?

class counter 

public static final synchronized int getcount()

}class dog extends counter

public void woof()

} class cat extends counter

public void meow()

}public class ruckus ;

for (int i = 0; i < dogs.length; i++)

dogs[i].woof();

cat cats = ;

for (int i = 0; i < cats.length; i++)

cats[i].meow();

system.out.print(dog.getcount() + " woofs and ");

system.out.println(cat.getcount() + " meows");

}}

我們聽到兩聲狗叫和三聲貓叫——肯定是好一陣喧鬧——因此,程式應該列印2 woofs and 3 meows,不是嗎?不:它列印的是5 woofs and 5 meows。所有這些多出來的吵鬧聲是從**來的?我們做些什麼才能夠阻止它?

該程式列印出的犬吠聲和貓叫聲的數量之和是10,它是實際總數的兩倍。問題在於dog和cat都從其共同的超類那裡繼承了count域,而count又是乙個靜態域。每乙個靜態域在宣告它的類及其所有子類中共享乙份單一的拷貝,因此dog和cat使用的是相同的count域。每乙個對woof或meow的呼叫都在遞增這個域,因此它被遞增了5次。該程式分別通過呼叫dog.getcount和cat.getcount讀取了這個域兩次,在每一次讀取時,都返回並列印了5。

在設計乙個類的時候,如果該類構建於另乙個類的行為之上,那麼你有兩種選擇:一種是繼承,即乙個類擴充套件另乙個類;另一種是組合,即在乙個類中包含另乙個類的乙個例項。選擇的依據是,乙個類的每乙個例項都是另乙個類的乙個例項,還是都有另乙個類的乙個例項。在第一種情況應該使用繼承,而第二種情況應該使用組合。當你拿不準時,優選組合而不是繼承[ej item 14]。

一條狗或是乙隻貓都不是一種計數器,因此使用繼承是錯誤的。dog和cat不應該擴充套件counter,而是應該都包含乙個計數器域。每一種寵物都需要有乙個計數器,但並非每乙隻寵物都需要有乙個計數器,因此,這些計數器域應該是靜態的。我們不必為counter類而感到煩惱;乙個int域就足夠了。

下面是我們重新設計過的程式,它會列印出我們所期望的2 woofs, 3 meows:

class dog 

public static int woofcount() ;

public void woof()

} class cat

public static int meowcount() ;

public void meow()

}

ruckus類除了兩行語句之外沒有其它的變化,這兩行語句被修改為使用新的方法名來訪問計數器:

system.out.print(dog.woofcount() + " woofs and ");

system.out.println(cat.meowcount() + " meows");

總之,靜態域由宣告它的類及其所有子類所共享。如果你需要讓每乙個子類都具有某個域的單獨拷貝,那麼你必須在每乙個子類中宣告乙個單獨的靜態域。如果每乙個例項都需要乙個單獨的拷貝,那麼你可以在基類中宣告乙個非靜態域。還有就是,要優選組合而不是繼承,除非匯出類真的需要被當作是某一種基類來看待。

乙個關於 的謎題

乙個關於 的謎題 今天在看書過程中發現了乙個問題,還挺有意思的,分享給大家。下面兩個 python 表示式會產生什麼結果?t 1,2,3,4 t 2 5,6 給四個備選答案 t變成 1,2,3,4,5,6 因為 tuple 不支援對它的元素賦值,所以會丟擲typeerror異常。以上兩個都不是。以上...

關於Jsoup的乙個小問題

利用jsoup可以實現對網頁資訊進行有效解析和提取,例如有網頁內容如下 hello,jsoup jsoup的官方 利用jsoup提取標籤的內容,如下 document doc null trycatch ioexception ioe 提取標籤的內容 string strtitle doc.sele...

乙個關於選擇的小問題

以前看過這樣乙個問題 乙個人參加有獎答題,主持人給出了a b c三個選項。這個不知道問題的答案,就隨便選了乙個選項。然後主持人排除了剩下兩個答案中的乙個,告訴這個人有一次改變自己選項的機會。請問 這時候這個人該不該改變自己的選項?剛看到這個問題,我的第一反映是完全沒必要,因為既然排除了乙個錯誤選項,...