动态绑定java测试



在做这个java练习时,我不明白为什么最后一行会打印出来"5〃;。

public class Customer { }
public class RegisteredCustomer extends Customer{}
public class Shop {
public int computeDiscount(Customer c){return 0;}
}
public class OnlineShop extends Shop {
public int computeDiscount(Customer c){return 5;}
public int computeDiscount(RegisteredCustomer c){return 15;}
}

public class OnlinePremiumShop extends OnlineShop{
public int computeDiscount(RegisteredCustomer c){return 20+super.computeDiscount(c);}
}

public static void main(String[] args) {
RegisteredCustomer c3 = new RegisteredCustomer();
Shop s2 = new OnlinePremiumShop();
System.out.println(s2.computeDiscount(c3));
}

如果c3既是动态类型又是静态类型RegisteredCustomer,为什么java会捕获带有Customer参数的方法?我想我被捆绑弄糊涂了。。思考不出错的过程是什么?

Shop s2 = new OnlinePremiumShop();

在这里创建一个OnlinePremiumShop对象,并将其分配给类型为Shop的引用。在Shop中,唯一声明的方法是:

public int computeDiscount(Customer c){return 0;}

因此,当您调用s2.computeDiscount()时,必须调用带有Customer参数的那个。由于具体类型OnlinePremiumShop覆盖了这个方法,所以它就是被调用的方法,结果是5

s2不知道任何采用RegisteredCustomer参数的computeDsicount()版本,因此它无法绑定到子类中的那个版本。