通過避免繼承來避免破壞類的行為
站在用戶的角度思考問題,與客戶深入溝通,找到北海街道網(wǎng)站設(shè)計(jì)與北海街道網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋北海街道地區(qū)。Java的優(yōu)勢之一是繼承的概念,其中一個(gè)類可以從另一個(gè)類派生,但有時(shí)最好防止另一個(gè)類的繼承。 為了防止繼承,在創(chuàng)建類時(shí)使用關(guān)鍵字“ final”。
例如,如果一個(gè)類可能被其他程序員使用,則如果創(chuàng)建的任何子類可能引起問題,則你可能希望防止繼承。 一個(gè)典型的例子是String類。 如果我們想創(chuàng)建一個(gè)String子類:
public class MyString extends String{
}
我們將面臨以下錯(cuò)誤:
cannot inherit from final java.lang.String
String類的設(shè)計(jì)者意識(shí)到它不是繼承的候選者,因此阻止了對(duì)其進(jìn)行擴(kuò)展。
為什么要防止繼承?
防止繼承的主要原因是確保類的行為方式不會(huì)被子類破壞。
假設(shè)我們有一個(gè)Account類和一個(gè)擴(kuò)展它的子類OverdraftAccount。 類帳戶具有方法getBalance():
public double getBalance()
{
return this.balance;
}
至此,在我們的討論中,子類OverdraftAccount尚未覆蓋此方法。
(注意:有關(guān)使用此Account和OverdraftAccount類的另一討論,請(qǐng)參見如何將子類視為超類)。
讓我們?yōu)槊總€(gè)Account和OverdraftAccount類創(chuàng)建一個(gè)實(shí)例:
Account bobsAccount = new Account(10);
bobsAccount.depositMoney(50);
OverdraftAccount jimsAccount = new OverdraftAccount(15.05,500,0.05);
jimsAccount.depositMoney(50);
//create an array of Account objects
//we can include jimsAccount because we
//only want to treat it as an Account object
Account[] accounts = {bobsAccount, jimsAccount};
//for each account in the array, display the balance
for (Account a:accounts)
{
System.out.printf("The balance is %.2f%n", a.getBalance());
}
The output is:
The balance is 60.00
The balance is 65.05
一切似乎都按預(yù)期工作,在這里。 但是,如果OverdraftAccount覆蓋方法getBalance()怎么辦? 沒有什么可以阻止它執(zhí)行以下操作:
public class OverdraftAccount extends Account {
private double overdraftLimit;
private double overdraftFee;
//the rest of the class definition is not included
public double getBalance()
{
return 25.00;
}
}
如果再次執(zhí)行上述示例代碼,則輸出將有所不同,因?yàn)閖imsAccount調(diào)用了OverdraftAccount類中的getBalance()行為:
The output is:
The balance is 60.00
The balance is 25.00
不幸的是,子類OverdraftAccount將永遠(yuǎn)不會(huì)提供正確的余額,因?yàn)槲覀円呀?jīng)通過繼承破壞了Account類的行為。
如果您設(shè)計(jì)一個(gè)供其他程序員使用的類,請(qǐng)始終考慮任何潛在子類的含義。 這就是不能擴(kuò)展String類的原因。 程序員必須知道,當(dāng)他們創(chuàng)建一個(gè)String對(duì)象時(shí),它總是會(huì)表現(xiàn)得像String一樣,這一點(diǎn)非常重要。
如何防止繼承
要阻止類擴(kuò)展,類聲明必須明確聲明它不能被繼承。 這可以通過使用“ final”關(guān)鍵字來實(shí)現(xiàn):
public final class Account {
}
這意味著Account類不能是超類,而OverdraftAccount類不能再作為其子類。
有時(shí),您可能希望僅限制超類的某些行為,以避免子類損壞。 例如,OverdraftAccount仍然可以是Account的子類,但是應(yīng)避免覆蓋getBalance()方法。
在這種情況下,使用方法聲明中的“ final”關(guān)鍵字:
public class Account {
private double balance;
//the rest of the class definition is not included
public final double getBalance()
{
return this.balance;
}
}
注意在類定義中如何不使用final關(guān)鍵字。 可以創(chuàng)建Account的子類,但是它們不能再覆蓋getBalance()方法。 任何調(diào)用該方法的代碼都可以確信它會(huì)按原始程序員的意圖工作。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。