方法重载
类的层次结构中,如果子类中的一个方法与它超类中的方法有相同的方法名和类型声明,子类中的方法重载(override)超类中的方法。从子类中调用重载方法时,它总是引用子类定义的方法。而超类中定义的方法将被隐藏。
方法重载构成Java的一个最强大的概念的基础:动态方法调度(dynmic method dispatch)。动态方法调度是一种在运行时而不是编译时调用重载方法的机制。动态方法调度是很重要的,因为这也是Java实现运行时多态性的基础。
多态性是面向对象编程的本质,原因如下:它允许通用类指定方法,这些方法对该类的所有派生类都是公用的。同时该方法允许子类定义这些方法中的某些或全部的特殊的实现。重载方法是Java实现它的多态性--“一个接口,多个方法”的另一种方式。
成功应用多态的关键部分是理解超类和子类形成了一个从简单到复杂类层次。正确应用多态,超类提供子类可以直接运用的所有元素。多态也定义了这些派生类必须自己实现的方法。这允许子类在加强一致接口的同时,灵活的定义它们自己的方法。这样,通过继承和重载方法的联合,超类可以定义供它的所有子类使用的方法的通用形式。
动态的运行时多态是面向对象设计代码重用的一个强大的机制。现有代码库在维持抽象接口同时不重新编译的情况下调用新类实例的能力是一个极其强大的工具。
//Using run-time polymorphism.
class Figure {
double dim1;
double dim2;
Figure(double a, double b) {
dim1 = a;
dim2 = b;
}
double area(){
System.out.prinln("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;//obtain a reference of type Figure
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());
}
}