9. 多态

218 阅读1分钟

实例方法(无static)默认是多态的。

  1. 运行时根据this决定调用哪个方法。
  2. 静态方法没有多态。
  3. 参数静态绑定,接受者动态绑定。
public class Shape {
    // 返回当前"形状"(Shape)的面积
    public double getArea() {
        return 0d;
    }
}

public class Circle extends Shape{
    // 圆的直径
    // 提示,圆周率可以使用Math.PI
    private double diameter;

    public Circle(double diameter) {
        this.diameter = diameter;
    }

    @Override
    public double getArea(){
        return this.diameter * Math.PI;
    }
}

public class Rectangle extends Shape{
    // 长方形的长
    private double a;
    // 长方形的宽
    private double b;

    public Rectangle(double a, double b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public double getArea(){
        return this.a * this.b;
    }
}

public class Square extends Shape{
    // 正方形的边长
    private double sideLength;

    public Square(double sideLength) {
        this.sideLength = sideLength;
    }

    @Override
    public double getArea(){
        return Math.pow(this.sideLength, 2);
    }
}

上面三个类继承自Shape,当我们声明上面三个实例后,分别调用他们的getArea方法,会发现调用的是每个形状中的getArea方法,这就是多态。
我们在同一个包下建如下几个类:

public class ParamBase {}
public class ParamSub extends ParamBase {}

// 父类
public class Base {
    public void print(ParamBase param) {
        System.out.println("I am Base, the param is ParamBase");
    }

    public void print(ParamSub param) {
        System.out.println("I am Base, the param is ParamSub");
    }
}

// 子类
public class Sub extends Base {
    @Override
    public void print(ParamBase param) {
        System.out.println("I am Sub, the param is ParamBase");
    }

    @Override
    public void print(ParamSub param) {
        System.out.println("I am Sub, the param is ParamSub");
    }
}

然后调用一下:

public static void main(String[] args) {
    Base object = new Sub();
    ParamBase param = new ParamSub();
    object.print(param);
}

调用的是Sub类下面的第一个方法。如果将参数param改为ParamSub,那么调用的就是第二个方法。