前面声明过,重载方法允许Java支持运行时多态性。多态性是面向对象编程的本质,原因如下:它允许通用类指定方法,这些方法对该类的所有派生类都是公用的。
同时该方法允许子类定义这些方法中的某些或全部的特殊实现。重载方法是Java实现它的多态性——“一个接口,多个方法”的另一种方式。成功应用多态的关键部分是理解超类和子类形成了一个从简单到复杂类层次。
正确应用多态,超类提供子类可以直接运用的所有元素。多态也定义了这些派生类必须自己实现的方法。这允许子类在加强一致接口的同时,灵活的定义它们自己的方法。
这样,通过继承和重载方法的联合,超类可以定义供它的所有子类使用的方法的通用形式。
动态的运行时多态是面向对象设计代码重用的一个最强大的机制。现有代码库在维持抽象接口同时不重新编译的情况下调用新类实例的能力是一个极其强大的工具。
让我们看一个运用方法重载的更实际的例子。下面的程序创建了一个名为Figure的超类,它存储不同二维对象的大小。它还定义了一个方法area( ),该方法计算对象的面积。程序从Figure派生了两个子类。第一个是Rectangle,第二个是Triangle。每个子类重载area( )方法,它们分别返回一个矩形和一个三角形的面积。
// Using run-time polymorphism.
class Figure {
double dim1;
double dim2;
Figure(double a, double b) {
dim1 = a;
dim2 = b;
}
double area() {
System.out.println("Area for Figure is undefined.");
return 0;
}
}
class Rectangle extends Figure {
Rectangle(double a, double b) {
super(a, b);
}
// override area for rectangle
double area() {
System.out.println("Inside Area for Rectangle.");
return dim1 * dim2;
}
}
class Triangle extends Figure {
Triangle(double a, double b) {
super(a, b);
}
// override area for right triangle
double area() {
System.out.println("Inside Area for Triangle.");
return dim1 * dim2 / 2;
}
}
class FindAreas {
public static void main(String args[]) {
Figure f = new Figure(10, 10);
Rectangle r = new Rectangle(9, 5);
Triangle t = new Triangle(10, 8);
Figure figref;
figref = r;
System.out.println("Area is " + figref.area());
figref = t;
System.out.println("Area is " + figref.area());
figref = f;
System.out.println("Area is " + figref.area());
}
}
该程序输出如下:
Inside Area for Rectangle.
Area is 45
Inside Area for Triangle.
Area is 40
Area for Figure is undefined.
Area is 0
通过继承和运行时多态的双重机制,可以定义一个被很多不同却有关的对象类型运用的一致的接口。
这种情况下,如果一个对象是从Figure派生,那么它的面积可以由调用area( )来获得。无论用到哪种图形的类型,该操作的接口是相同的。
通过继承和运行时多态的双重机制,可以定义一个被很多不同却有关的对象类型运用的一致的接口。这种情况下,如果一个对象是从Figure派生,那么它的面积可以由调用area( )来获得。无论用到哪种图形的类型,该操作的接口是相同的。