在抽象类方法中调用接口方法

时间:2017-02-17 21:30:50

标签: java interface abstract-class invoke

代码正在运行,但我想更好地理解这个主题,我不知道如何命名问题。如果接口方法为空,我怎么可能在抽象类方法中调用接口方法?谁能告诉我在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);
}
}

3 个答案:

答案 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);