动态绑定 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 中的那个版本.
做这个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 中的那个版本.