[英]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類中的setAccountHolderName
和getAccountHolderName
,否則編譯器表示您需要將您的類定義為抽象類,因此其他類可以擴展您的抽象類並定義這兩種方法以形成具體的類。
如果要擺脫編譯錯誤,則需要重寫這兩個方法,就像在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是一個接口,任何實現該接口的類(在這種情況下, 此類為BankAccount和SafeDepositBoxAccount )都必須實現該接口的所有方法,除非該類被聲明為abstract 。
對於BankAccount類,既未提供getAccountHolderName和setAccountHolderName的實現,也未將NamedAccount類標記為abstract 。 因此,發生此錯誤。
有兩種解決方案:
注意:@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.