动态绑定 java 测试

Dynamic Binding java test

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