En una clase, ¿Cuantas veces es posible definir un método con el mismo nombre? En java muchas veces, es posible definir métodos con el mismo nombre varias veces simplemente cambiando en cada uno de ellos el número de argumentos, el tipo o ambos. Esta característica es conocida como sobrecarga de métodos o method overloading. El compilador resolverá la llamada al método dependiendo del número y/o tipo de parámetros pasados.
Para ilustrar este concepto, vamos a definir el método fillColor en la clase Circle el cual va rellenar el círculo con diferentes colores. Para especificar un color necesitamos un esquema de colores, por lo tanto vamos a considerar dos esquemas, el esquema RGB y el HSB.
- El esquema RGB es la combinación de tres colores, rojo (Red), verde (Green) y azul (Blue) y por convención cada color es dado en un rango de 0 a 255.
- El esquema HSB es la combinación del matiz (Hue), la saturación (Saturation) y el brillo (Brightness) y por convención son dados en un rango de 0.0 a 1.0.
Por lo tanto para usar el esquema RGB necesitamos pasar 3 parámetros enteros, mientras que para el HSB debemos pasar 3 parámetros flotantes, entonces ¿Cómo puede nuestra clase soportar estas variantes?.
class Circle {
public void fillColor(int red, int green, int blue) {
/* color the circle using RGB color values – actual code elided */
}
public void fillColor(float hue, float saturation, float brightness) {
/* color the circle using HSB values – actual code elided */
}
}
Como puedes ver ambos métodos fillColor usan exactamente el mismo nombre y ambos toman tres argumentos, sin embargo los tipos de argumentos son diferentes. El compilador decidirá exactamente cuál método ejecutar basado en el tipo de argumentos durante la llamada al método fillColor de la clase Circle. Consideremos la siguiente ejecución.
Circle c1 = new Circle(10, 20, 10);
c1.fillColor(0, 255, 255);
Circle c2 = new Circle(50, 100, 5);
c2.fillColor(0.5f, 0.5f, 1.0f);
Para el objeto c1 la llamada al método fillColor tiene argumentos enteros 0,255,255 por lo tanto el compilador resolvió llamar al método fillColor que usa el esquema RGB fillColor(int red, int green, int blue). Para el objeto c2 la llamada al método fillColor tiene argumentos flotantes 0.5f, 0.5f, 1.0f, por lo tanto fue resuelto llamando al método que usa el esquema HSB fillColor(float hue, float saturation, float brightness). El ejemplo anterior es un método sobrecargado (overloaded method). El método tiene el mismo nombre y el mismo número de argumentos pero el tipo de argumentos son diferentes.
Es posible también sobrecargar métodos usando diferente número de argumentos, evitando así repetir el mismo código usando diferentes funciones. Veamos un ejemplo de esto.
class HappyBirthday {
// overloaded wish method with String as an argument
public static void wish(String name) {
System.out.println("Happy birthday " + name + "!");
}
// overloaded wish method with no arguments;
// this method in turn invokes wish(String) method
public static void wish() {
wish("to you");
}
public static void main(String[] args) {
wish();
wish("dear James Gosling");
}
}
Esto imprime
Happy birthday to you!
Happy birthday dear James Gosling!
Aquí, el método wish(String name) desea un feliz cumpleaños cuando se conoce el nombre de la persona, mientras que el método wish() desea un feliz cumpleaños a cualquiera. Como puedes ver, la sentencia System.out.println no fue escrita denuevo en el método wish(), tu puedes re-usar la definicion del metodo wish(String name) pasando por defecto el valor “to you”.