在以下代码中:
class Payment { }
class CashPayment extends Payment{ }
class Store{
public void acceptPayment (Payment p)
{System.out.println ("Store::Payment");}
}
class FastFoodStore extends Store {
public void acceptPayment (CashPayment c)
{System.out.println ("FastFoodStore::CashPayment");}
public void acceptPayment (Payment p)
{System.out.println ("FastFoodStore::Payment");}
}
//
public class Example {
public static void main(String [] args){
Store store1 = new Store();
FastFoodStore sandwitchPlace = new FastFoodStore ();
Store store2 = new FastFoodStore();
Payment p1 = new Payment();
CashPayment cp = new CashPayment();
Payment p2 = new CashPayment();
store1.acceptPayment (p1);
store1.acceptPayment (cp);
store1.acceptPayment (p2);
sandwitchPlace.acceptPayment (p1);
sandwitchPlace.acceptPayment (cp);
sandwitchPlace.acceptPayment (p2);
store2.acceptPayment (p1);
store2.acceptPayment (cp);
store2.acceptPayment (p2);
}
}
我真正不明白的是为什么
store2.acceptPayment (cp);
将显示FastFoodStore :: Payment但不显示FastFoodStore :: CashPayment?
store2基本上将在运行时调用FastFoodStore中的方法,并传递CashPayment类型参数。在这种情况下,将显示FastFoodStore :: CashPayment。
有人可以帮忙吗?
最佳答案
在决定调用哪种方法时,编译时间和运行时间之间存在复杂的工作量分配。有关完整内容,请参见Method Invocation Expressions。
在您的示例中,当目标表达式的类型为Store时,编译器将仅看到Store acceptPayment方法,该方法需要Payment参数。这承诺调用一个带有Payment参数的方法。
在运行时,仅考虑FastFoodStore中的public void acceptPayment (Payment p)
方法(目标对象的类)。
关于java - 混合类型java多态。预期输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14763449/