动态绑定也叫后期绑定。就是在运行时根据对象的类型进行绑定。Java中除了static方法和final方法(private属于final方法)之外,其它所有的方法都是动态绑定。
下面是书中“几何形状”的例子:
package com.ran.unit8;
import java.util.Random;
/**
* 动态绑定
*/
class Shape{
public void draw(){}
public void erase(){}
}
class Circle extends Shape{
@Override
public void draw() {
System.out.println("Circle draw");
}
@Override
public void erase() {
System.out.println("Circle erase");
}
}
class Square extends Shape{
@Override
public void draw() {
System.out.println("Square draw");
}
@Override
public void erase() {
System.out.println("Square erase");
}
}
class Triangle extends Shape{
@Override
public void draw() {
System.out.println("Triangle draw");
}
@Override
public void erase() {
System.out.println("Triangle erase");
}
}
class RandomShapeGenerator{
private Random rand = new Random(47);
public Shape next(){
switch (rand.nextInt(3)){
default:
case 0: return new Circle();
case 1: return new Square();
case 2: return new Triangle();
}
}
}
public class Shapes {
private static RandomShapeGenerator generator = new RandomShapeGenerator();
public static void main(String[]args){
Shape[] shapes = new Shape[9];
for (int i=0;i<shapes.length;i++){
shapes[i] = generator.next();
}
for (Shape s:shapes
) {
s.draw();
}
}
}
RandomShapeGenerator是一种“工厂”,每次调用next()方法时,他可以为随机选择的Shape对象产生一个引用。向上转型是在return语句里发生的。