代码正在运行,但我想更好地理解这个主题,我不知道如何命名问题。如果接口方法为空,我怎么可能在抽象类方法中调用接口方法?谁能告诉我在Java中如何调用这种操作?在我参加的单一课程中,幻灯片将问题命名为"通过API编程"但是当我谷歌时,我找不到任何东西。
我有一个具有getBalance方法的接口类:
public interface BankAccount {
int getBalance();
...
}
然后我在抽象的Class方法中调用接口方法:
public abstract class AbstractBankAccount implements BankAccount {
private final bankAccountNo;
private int accountBalance;
abstractBankAccount(int bankAccountNo) {
this.bankAccountNo = bankAccountNo;
}
public void transferBalance(bankAccount account) {
// so here is what I am struggling to understand: account.getBalance() is called, but getBalance() method in interface is empty, how does it work then?
final int accountBal = account.getBalance();
if (accountBal < 0)
throw new IllegalArgumentException("not enough money on the account");
accountBalance += accountBal;
account.withdraw(accountBal);
}
}
答案 0 :(得分:3)
在抽象类中,一些方法留给具体的继承者来实现。
虽然现在该方法是空的(抽象),但是当您创建非抽象实现时,您必须为该方法提供一个主体。那个身体就是所谓的。
以下是一个例子:
abstract class Parent {
abstract String someMethod();
public String getValue() {
return someMethod();//how could this work?! someMethod() has no body!
}
}
class Child extends Parent {
@Override
String someMethod() { //this won't compile unless I implement someMethod()
return "data";
}
}
尽管someMethod()在Parent中是抽象的,但您实际上无法创建Parent的实例(因为它是抽象的)。你必须扩展它,这需要你提供someMethod()的实现。
答案 1 :(得分:1)
答案是,当运行此参数时,account
参数将是实现bankAccount.getBalance()的具体类的实例。这就是抽象的工作原理
答案 2 :(得分:1)
在我参加的单一课程中,幻灯片将问题命名为 &#34;通过API编程&#34;但是当我谷歌时,我找不到任何东西。
和
在抽象类方法中我怎么可能调用一个 如果接口方法为空,接口方法是什么?
在具体课程的方法中,您可能会遇到完全相同的情况 这里接口定义了一个契约:实现的方法,但这些都是界面中的抽象 要按接口编程,操作放在接口(此处为BankAccount)的概念的代码不应直接引用接口的具体类,而应该是接口本身,如果我们希望能够切换到接口的另一个实现类。 BR />
这就是为什么用public void transferBalance(BankAccount account)
类型作为参数定义BankAccount
的原因。
当然,一次必须选择并实例化一个具体的类,但它应该是指定的唯一时间。
执行转移的客户端代码可以写:
// I instantiate concrete classes but I refer interface as declared type.
BankAccount bankAcountDebitor = new ConcreteBankAccount();
BankAccount bankAcountCreditor = new ConcreteBankAccount();
// I invoke a method that takes as argument a type derived from the interface type
bankAcountDebitor.transferBalance(bankAcountCreditor);
通过这种方式,即使有一天我们切换到另一个具体的BankAccount
表示:
bankAcountDebitor.transferBalance(bankAcountCreditor);
仍然可以正常编译,因为该方法将接口类型作为参数。
所以你可以写下:
BankAccount bankAcountDebitor = new ConcreteUniversalBankAccount();
BankAccount bankAcountCreditor = new ConcreteUniversalBankAccount();
bankAcountDebitor.transferBalance(bankAcountCreditor);