gpt4 book ai didi

java - 混合类型 java 多态性。输出不是预期的

转载 作者:行者123 更新时间:2023-11-30 09:27:02 26 4
gpt4 key购买 nike

在下面的代码中:

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 参数。这 promise 调用一个采用 Payment 参数的方法。

在运行时,只考虑目标对象类 FastFoodStore 中的 public void acceptPayment (Payment p) 方法。

关于java - 混合类型 java 多态性。输出不是预期的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14763449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com