实例方法(无static)默认是多态的。
- 运行时根据this决定调用哪个方法。
- 静态方法没有多态。
- 参数静态绑定,接受者动态绑定。
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,那么调用的就是第二个方法。