在做这个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()
版本,因此它无法绑定到子类中的那个版本。