1

java支持多分派吗?如果不是,下面的代码是如何工作的?

账户.java

public interface Account 
{
    public void calculateInterest();
}

SavingsAccount.java

public class SavingsAccount implements Account
{

}

LoanAccount.java

public class LoanAccount implements Account
{

}

利息计算.java

public class InterestCalculation 
{
    public void getInterestRate(Account objAccount)
    {
        System.out.println("Interest Rate Calculation for Accounts");
    }

    public void getInterestRate(LoanAccount loanAccount)
    {
        System.out.println("Interest rate for Loan Account is 11.5%");
    }

    public void getInterestRate(SavingsAccount savingAccount)
    {
        System.out.println("Interest rate for Savings Account is 6.5%");
    }
}

计算利息.java

public class CalculateInterest 
{
     public static void main(String[] args) 
     {
         InterestCalculation objIntCal = new InterestCalculation();
         objIntCal.getInterestRate(new LoanAccount());
         objIntCal.getInterestRate(new SavingsAccount());        
     }
}

输出

贷款账户利率为 11.5%
储蓄账户利率为 6.5%
4

1 回答 1

1

首先是一些术语

重载是创建具有不同实现的多个同名方法的能力。

在 Java 中,这是基于参数的编译时类型执行的:使用具有匹配签名的方法,与参数的值无关。

覆盖 允许子类或子类提供已由其超类或父类之一提供的方法的特定实现。

在 Java 中,这是通过根据所引用对象的运行时(动态)类型确定要调用的方法来执行的。这是 Java 实现单一调度的方式,不要与重载混淆

多重分派意味着一个函数或方法可以基于运行时(动态)类型进行动态分派,或者在更一般的情况下,基于其他属性,可以根据其多个参数进行分派。

Java 支持多分派吗?

在 Java 中,没有直接支持多分派。

但是,您可以通过使用多层单调度结合重载来模拟多调度。

这段代码是如何工作的?

请注意,此代码首先需要您提供calculateInterest()forLoanAccount和的实现SavingAccount,即使它不会在您的 POC 的其余部分中使用。

在您的类InterestCalculation中,您有三个不同的方法重载getInterestRate()。它们每个都有不同的签名(例如参数类型)。因此 main() 将根据参数的声明类型(从构造函数推导出来)调用正确的方法。

您可以优化您对单次调度的使用并使其InterestCalculation更加通用(例如,您可以添加更多的实现而Account无需更改它):

public interface Account 
{
    public void calculateInterest();
    public double getInterest(); 
    public String getType(); 
}
...
public class InterestCalculation 
{
    public void getInterestRate(Account objAccount)
    {
        System.out.print ("Interest Rate for "+objAccount.getType()+" is ");
        System.out.print (objAccount.getInterest());
        System.out.println (" %");
    }
}

在线演示

于 2017-05-27T10:09:14.413 回答