在以下代码中:

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/

10-12 21:12