在OOP编程语言中,多态是继数据抽象和继承之后的第三种基本特征。
动态绑定(后期绑定/运行时绑定):在运行时根据对象的类型进行绑定。也就是编译器一直不知道对象的类型,但方法调用机制能找到正确的方法体并加以调用。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*/
协变返回类型:即在子类的覆盖方法中可以返回父类方法中的返回类型的的子类类型。
class Base{ public Object OverrideredFunction(){
return new Object();
}
}
class Inherit extends Base{
//String是Object的子类,所以可以这么写
@Override
public String OverrideredFunction(){
//这里return父类方法的返回类型Object的子类类型String
return "Nice!";
}
}
来源:oschina
链接:https://my.oschina.net/u/2653987/blog/652955