簡體   English   中英

Java覆蓋抽象接口方法

[英]Java Override Abstract Interface Method

我有一個實現NamedAccount.java的BankAccount.java,這是一個抽象接口,但是它一直給我一個錯誤,因為BankAccount.java不是抽象的,所以無法覆蓋它。 我該如何解決這個問題? 我試圖在兩種情況下都添加@Override,但是它不起作用!

BankAccount.java:

public class BankAccount implements NamedAccount {

   private String myCustomer;
   private double myBalance;
   private double myInterest;
   protected int myMonthlyWithdrawCount;
   protected double myMonthlyServiceCharges;

   public BankAccount(final String theNameOfOwner, 
                      final double theInterestRate) {
      myCustomer = theNameOfOwner;
      myInterest = theInterestRate;
      myBalance = 0.0;
      myMonthlyWithdrawCount = 0;
      myMonthlyServiceCharges = 0;
   }

   public double getBalance() {
      return myBalance;   
   }

   public boolean processDeposit(final double theAmount) {
      boolean trueDeposit = false;
      if (theAmount > 0) {
         myBalance += theAmount;
         trueDeposit = true;
      }
      return trueDeposit;       
   }

   public boolean processWithdrawal(final double theAmount) {
      boolean trueWithdrawal = false;
      if (theAmount > 0 && theAmount > myBalance) {
         myBalance -= theAmount;
         trueWithdrawal = true;
      }
      return trueWithdrawal; 
   }

   public double calculateInterest() {
      return myBalance * (myInterest / 12.0);
   }

   public void performMonthlyProcess() {
      myBalance -= myMonthlyServiceCharges;
      myBalance += calculateInterest();
      myMonthlyWithdrawCount = 0;
      myMonthlyServiceCharges = 0.0;
      if (myBalance < 0.0) {
         myBalance = 0.0;
      }
   }
}

NamedAccount.java:

 public interface NamedAccount {
   String getAccountHolderName();
   void setAccountHolderName(final String theNewName);
 } 

為了使其運行,您將需要以下SafeDepositBoxAccount.java:

 public class SafeDepositBoxAccount implements NamedAccount {


       private String mySafeName;

       public SafeDepositBoxAccount(final String theNameOfHolder) {
          mySafeName = theNameOfHolder;   
       }

       public String getAccountHolderName() {
          return mySafeName;
       }

       public void setAccountHolderName(final String theNewName) {
          mySafeName = theNewName;
       }
     }

錯誤提示您,因為類不是abstract所以必須 (從您的接口)重寫這些方法。 如果將類抽象化,則無需重寫這些方法。 就像是,

private String accountHolderName;
@Override
public String getAccountHolderName() {
    return accountHolderName;
}
@Override
public void setAccountHolderName(final String theNewName) {
    this.accountHolderName = theNewName;
}

由於您的班級BankAccount表示它實現了NamedAccount ,因此您需要實現合約中定義的方法,如此處提到的即BankAccount類中的setAccountHolderNamegetAccountHolderName ,否則編譯器表示您需要將您的類定義為抽象類,因此其他類可以擴展您的抽象類並定義這兩種方法以形成具體的類。

如果要擺脫編譯錯誤,則需要重寫這兩個方法,就像在SafeDepositBoxAccount類中定義的那樣:

public class BankAccount implements NamedAccount {
    .....
    private String accountHolderName;
    @Override
    public String getAccountHolderName() {
         return accountHolderName;
    }
    @Override
    public void setAccountHolderName(final String theNewName) {
         this.accountHolderName = theNewName;
    }
 }

在您的代碼中,NamedAccount是一個接口,任何實現該接口的類(在這種情況下, 此類BankAccountSafeDepositBoxAccount )都必須實現該接口的所有方法,除非該類被聲明為abstract

對於BankAccount類,既未提供getAccountHolderName和setAccountHolderName的實現,也未將NamedAccount類標記為abstract 因此,發生此錯誤。

有兩種解決方案:

  1. 要么將BankAccount類聲明為抽象類,
  2. 或編寫getAccountHolderName和setAccountHolderName方法的實現。

注意:@Override用於方法聲明旨在覆蓋超類中的方法聲明時。 BankAccount中的任何方法在超類中都沒有對應的方法,因此您不能@Override。

public abstract class BankAccount implements NamedAccount {

    abstract String getAccountHolderName();

    abstract void setAccountHolderName(final String theNewName);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM