溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java怎樣阻止類的繼承

發(fā)布時(shí)間:2020-05-28 16:11:05 來源:億速云 閱讀:748 作者:鴿子 欄目:編程語言

通過避免繼承來避免破壞類的行為

Java的優(yōu)勢(shì)之一是繼承的概念,其中一個(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ì)按原始程序員的意圖工作。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI