【问题标题】:Dynamic Binding java test动态绑定java测试
【发布时间】:2022-01-05 00:36:13
【问题描述】:

做这个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参数的方法?我想我对绑定感到困惑..思考不出错的过程是什么?

【问题讨论】:

  • 请显示驱动此示例的main() 方法。
  • s2Shop 类型的变量,它只有一个方法computeDiscount(Customer c),因此在调用s2.computeDiscount(c3) 时只能选择此方法。您还期望发生什么其他事情?为什么?

标签: java polymorphism dynamic-binding


【解决方案1】:
Shop s2 = new OnlinePremiumShop();

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

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

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

s2 不知道任何带有RegisteredCustomer 参数的computeDsicount() 版本,因此它无法在子类中绑定到该版本。

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2018-08-27
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多