Method overloading is the practice of giving a particular method the facility to deal with multiple data types.

a Java example: suppose you defined a class called Number, with extensions Real, Complex, and Fraction. class Complex might look like:

public class Complex extends Number {

  Float real, imaginary;

  public Complex() { 
      real = 0;
      imaginary = 0;
  }

  public Complex (Float r, Float i) {
      real = r;
      imaginary = i;
  }

  public Float realpart () {
       return real;
  }

  public Float imaginarypart () {
       return imaginary;
  }

  public Number add (Real foo) {
      return new Complex (foo.toFloat() + real, imaginary);
  }

  public Number add (Fraction foo) {
      return new Complex (foo.toFloat() + real, imaginary);
  }

  public Number add (Complex foo) {
      return new Complex (foo.realpart() + real, foo.imaginarypart() + imaginary);
  }

  ...
}
in this way, the method add is overloaded to react differently depending upon its argument's class. (the constructor method Complex is also overloaded, such that it can optionally accept initial values.)