面向对象的特征——多态
什么时候该用继承?有一个简单规则可以用来判断是否应该将数据设计为继承关系,这就是“is_a”规则。它指出子类的对象也是超类的对象。“is_a”规则的另一种表述是替换原则。它指出程序中出现超类对象的任何地方都可以使用子类对象替换。
一个对象变量可以声明为多种对象类型的现象称为多态。在运行时能够自动地选择适当的方法,称为动态绑定。
下面通过代码来展示多态与动态绑定:
public class Employee
{
private String name = "";
private int age = 0;
private double salary = 0.0;
……
public double getSalary() {
return salary;
}
……
}
public class Manager extends Employee {
private double bonus = 0.0;
……
@Override
public double getSalary() {
return super.getSalary() + bonus;
}
}
// 多态
Employee manager = new Manager("James", 36, 4000, 100);
// 动态绑定
System.out.println(manager.getSalary()); // 4100.0
如果没有多态性,那么抽象类以及接口就没有意义了。所以,多态是面向对象中及其重要的特性。但多态不是那么容易理解的。下面,写一个使用了多态性的案例。
首先,定义一个抽象类APay,该类有一个抽象方法pay,该方法是用来支付的。因为支付方式可能有多种,比如网银、支付宝、微信等。用户可以选择不同的付款方式
abstract class APay
{
abstract boolean pay ();
}
目前有网银、支付宝、微信三种支付方法:
class NetBankPay extends APay
{
public boolean pay (double money)
{
System.out.println("使用网银支付" + money);
return true;
}
}
class AliPay extends APay
{
public boolean pay (double money)
{
System.out.println("使用支付宝支付" + money);
return true;
}
}
class WxPay extends APay
{
public boolean pay (double money)
{
System.out.println("使用微信支付" + money);
return true;
}
}
接下来展示多态的用法
public class T1
{
public static void main (String [] args)
{
// ...
pay(new AliPay(), 2888);
}
public static boolean pay (APay payType, double money)
{
return payType.pay(money);
}
}