在OOP编程语言中,多态是继数据抽象和继承以后的第三种基本特征。java
动态绑定(后期绑定/运行时绑定):在运行时根据对象的类型进行绑定。也就是编译器一直不知道对象的类型,但方法调用机制能找到正确的方法体并加以调用。draw()方法的全部调用都是经过动态绑定进行的,由随机产生几何形状能够看出,编译器事先不知道哪些对象会调用draw(),都是在运行时动态绑定的。编程
package Eight; import java.util.Random; class Shape{ public void draw(){ System.out.println("Shape draw"); } public void out(){ System.out.println("Shape"); } } class Circle extends Shape{ public void draw(){ System.out.println("Circle draw"); } public void out(){ System.out.println("Circle"); } } class Square extends Shape{ public void draw(){ System.out.println("Square draw"); } public void out(){ System.out.println("Square"); } } class RandomShapeGenerator{ private Random random = new Random(47); public Shape next(){ switch(random.nextInt(3)){ default: case 0: return new Circle(); case 1: return new Square(); } } } public class Shapes { private static RandomShapeGenerator gen = new RandomShapeGenerator(); public static void main(String[] args){ Shape[] s = new Shape[4]; for(int i=0;i<s.length;i++){ s[i] = gen.next(); } for(Shape sp:s){ sp.draw(); sp.out(); } } } /*Circle draw 动态绑定 Circle draw Square draw Circle draw*/ /*添加out方法后 * Circle draw Circle Circle draw Circle Square draw Square Circle draw Circle*/
协变返回类型:即在子类的覆盖方法中能够返回父类方法中的返回类型的的子类类型。dom
class Base{ public Object OverrideredFunction(){ return new Object(); } } class Inherit extends Base{ //String是Object的子类,因此能够这么写 @Override public String OverrideredFunction(){ //这里return父类方法的返回类型Object的子类类型String return "Nice!"; } }