JAVA中的多态机制

时间:2022-09-14 21:54:38

在JAVA中,多态是继数据抽象和继承后的第三种基本特征,多态可以分离做什么和怎么做,将接口和实现分离开来,改善代码的组织结构和可读性,能够方便将来的创建可扩展程序,多态的作用是消除类型之间的耦合性。只要某些类是从同一基类导出的,就可以允许一种类型表现出与其它类之间的区别。

将一个方法调用同一个方法主体关联起来被称作绑定。若在程序执行前进行绑定,叫做前期绑定。前期绑定是面向过程语言不需要选择就默认的绑定方式。若在程序运行时根据对象的类型进行绑定,则称为后期绑定,也叫动态绑定或运行时绑定。也就是说编译器一直不知道对象的类型,通过方法调用机制来找到正确的方法体并加以调用。JAVA中除了static和final(包括private)方法外,其它所有方法均为动态绑定。看下面一段代码:

import java.util.*;
class Shape0{
public void draw(){}
public void erase(){}
}
class Circle extends Shape0{
public void draw(){
System.out.println("Circle.draw()");
}
public void erase(){
System.out.println("Circle.erase()");
}
}
class Square extends Shape0{
public void draw(){
System.out.println("Square.draw()");
}
public void erase(){
System.out.println("Square.erase()");
}
}
class Triangle extends Shape0{
public void draw(){
System.out.println("Triangle.draw()");
}
public void erase(){
System.out.println("Triangle.earse()");
}
}
class RandomShapeGenerator{
private Random rand = new Random(47);
public Shape0 next(){
switch(rand.nextInt(3)){
case 0 : return new Circle();
case 1 : return new Square();
case 2 : return new Triangle();
default:
}
return null;
}
}
public class Shape {
//@SuppressWarnings("unused")
private static RandomShapeGenerator gen =
new RandomShapeGenerator();
public static void main(String[] args) {
// TODO Auto-generated method stub
Shape0[] s = new Shape0[9];
for(int i = 0;i<s.length;i++)
s[i] = gen.next();
for(Shape0 shp:s)
shp.draw();
}

}
此程序运行结果为:

JAVA中的多态机制
Shape0基类为从它那继承来的所有类建立了一个统一的公用接口,导出类通过覆盖这些方法定义,来为每种特殊类型的几何形状提供不同的行为。

RandomShapeGenerator更像是一个工厂,用来为随机选择的Shape0对象产生一个引用,上转型发生在return语句当中,无论我们什么时候调用next()方法,绝对不可能知道具体类型是什么,我们总是能获得一个通用的Shape引用。对draw()方法的调用全部是通过动态绑定进行的。

所以可以说,多态是一项让我们将改变的事物与未改变的事物分离开来的重要技术。