2. El concepto de Java Sobrecarga de métodos es uno de
los conceptos más clásicos de programación . La
sobrecarga hace referencia a un método al cual se le
pueden pasar diferentes tipos o números de
argumentos. Vamos a verlo a través de ejemplos
sencillos. Para ello partiremos de dos clases . La clase
Bolsa y la clase Producto. Una Bolsa contiene varios
productos.
3. package com.arquitecturajava;
public class Producto {
private String nombre;
private double precio;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public double getPrecio() {
return precio;
}
public void setPrecio(double precio) {
this.precio = precio;
}
public Producto(String nombre, double precio) {
super();
this.nombre = nombre;
this.precio = precio;
}
}
package com.arquitecturajava;
import java.util.ArrayList;
import java.util.List;
public class Bolsa {
private List<Producto> lista = new
ArrayList<Producto>();
public void addProducto(Producto p) {
lista.add(p);
}
}
4. 1. Cómo sobrecargar un método
En general, para sobrecargar un método, simplemente declare versiones diferentes de él. El compilador se
ocupa del resto. Debe observar una restricción importante: el tipo y/o el número de parámetros de cada
método sobrecargado debe diferir. No es suficiente que dos métodos difieran solo en sus tipos de devolución.
Los tipos de devolución no proporcionan información suficiente en todos los casos para que Java decida qué
método utilizar.
Por supuesto, los métodos sobrecargados también pueden diferir en sus tipos de devolución. Cuando se llama
a un método sobrecargado, se ejecuta la versión del método cuyos parámetros coinciden con los argumentos.
Aquí hay un ejemplo simple que ilustra la sobrecarga de métodos:
5.
6.
7. Salida
Como puede ver, está sobrecargado cuatro veces. La primera versión no toma parámetros, la
segunda toma un parámetro entero, la tercera toma dos parámetros enteros (int), y la cuarta toma
dos parámetros double.
Observe que las primeras dos versiones de ovlDemo() no devuelven nada, y las otras dos devuelven
un valor. Esto es perfectamente válido, pero tal como se explicó, la sobrecarga no se ve afectada en
un sentido u otro por el tipo de devolución de un método. Por lo tanto, intentar utilizar las dos
versiones siguientes de provocará un error:
8.
9. 2. Conversiones de tipo automáticas
Como recordará anteriormente en Conversión de tipos de datos, Java proporciona ciertas conversiones
de tipo automáticas. Estas conversiones también se aplican a los parámetros de métodos
sobrecargados. Por ejemplo, considere lo siguiente:
12. En este ejemplo, sólo dos versiones de están definidos: uno que tiene un parámetro de tipo int y otro que
tiene un tipo double. Sin embargo, es posible pasar un valor de tipo byte, short, o float a . En el caso
de byte y short, Java automáticamente convierte a int. Así, mitipo(int) se invoca. En el caso de la float, el
valor se convierte a double y mitipo(double) es llamado.
Es importante entender, sin embargo, que la conversión automática sólo se aplican si no hay ninguna
coincidencia directa entre un parámetro y argumento. Por ejemplo, aquí está el programa anterior con la
adición de una versión de f ( ), que especifica un parámetro byte:
15. 3. Introducción a Polimorfismo
La sobrecarga de métodos soporta el polimorfismo porque es una de las formas en que Java
implementa el paradigma de “una interfaz, múltiples métodos“.
Para comprender cómo, considere lo siguiente: En los lenguajes que no admiten la sobrecarga de
métodos, a cada método se le debe asignar un nombre único. Sin embargo, frecuentemente querrá
implementar esencialmente el mismo método para diferentes tipos de datos.
Considere la función de valor absoluto. En los lenguajes que no admiten la sobrecarga, usualmente
hay tres o más versiones de esta función, cada una con un nombre ligeramente diferente. Por
ejemplo, en C, la función abs() devuelve el valor absoluto de un entero, labs() devuelve el valor
absoluto de un entero largo, y fabs() devuelve el valor absoluto de un valor de coma flotante. Como C
no admite sobrecarga, cada función debe tener su propio nombre, aunque las tres funciones hacen
esencialmente lo mismo.
Esto hace que la situación sea más compleja, conceptualmente, de lo que realmente es. Aunque el
concepto subyacente de cada función es el mismo, todavía tiene tres nombres para recordar. Esta
situación no ocurre en Java, porque cada método de valor absoluto puede usar el mismo nombre.
De hecho, la biblioteca de clases estándar de Java incluye un método de valor absoluto,
llamado abs(). Este método está sobrecargado por la clase Math de Java para manejar todos los
tipos numéricos. Java determina qué versión de abs() llamar en función del tipo de argumento.
16. El método addProducto
Estamos ante una situación muy sencilla con la clase Bolsa que contiene una lista de Productos y
para añadir elementos a la bolsa incorpora el método addProducto
public void addProducto(Producto p) {
lista.add(p);
}
Este método es elemental y simplemente añade nuevos Productos a la Bolsa. no hace nada más
17. Java Sobrecarga de métodos
Vamos a sobrecargarlo y generar un método con el mismo nombre pero diferente tipo de argumentos
que nos permita por ejemplo añadir también un Producto pero pasándole el concepto y el importe.
Esta es la sobrecarga más sencilla ya que simplemente cambiamos el tipo de parámetros pero
seguimos añadiendo el mismo concepto a la lista un producto.
public void addProducto(String nombre, double precio) {
lista.add(new Producto(nombre, precio));
}
18. El programa principal gana en flexibilidad y permite las dos opciones
package com.arquitecturajava;
public class Principal {
public static void main(String[] args) {
Producto p1= new Producto ("galletas",3);
Bolsa b= new Bolsa();
b.addProducto(p1);
b.addProducto("chocolate",4);
}
}
19. Otras Sobrecargas
No solo esta sobrecarga es posible sino que ademas podríamos añadir otras que nos permitan una mayor
flexibilidad. Por ejemplo podemos añadir un método que nos permita pasar como parámetro una lista de
Productos y añadirlos todos de golpe. Este método no se podrá denominar addProducto ya que este indica
que solo añade uno . Se tendrá que denominar addProductos por lo tanto “no es una sobrecarga” pero si
añade flexibilidad al código:
public void addProductos(List<Producto> productos) {
lista.addAll(productos);
}
20. Java varargs
¿Cómo podemos sobrecargarle ? . Bueno podemos usar las capacidades de varargs de Java y
añadir una sobrecarga que nos permita pasar varios productos de forma manual.
public void addProductos(Producto... productos) {
for (Producto f : productos) {
lista.add(f);
}
}
21. Vamos a ver cómo usar ambos.
package com.arquitecturajava;
import java.util.ArrayList;
import java.util.List;
public class Principal {
public static void main(String[] args) {
Producto p1= new Producto ("galletas",3);
Bolsa b= new Bolsa();
b.addProducto(p1);
b.addProducto("chocolate",4);
List<Producto> productos= new ArrayList<Producto>();
productos.add(new Producto("pan",2));
productos.add(new Producto("leche",3));
b.addProductos(productos);
b.addProductos(new Producto("pizza",5),new Producto("lechuga",3));
}
}
22. Acabamos de sobrecargar otro método en nuestra clase Bolsa y disponemos de dos
implementaciones
23. Java Sobrecarga y Constructores
El concepto de sobrecarga también se suele aplicar a los constructores ya que estos no son ni
más ni menos que métodos de la clase . En nuestro caso podríamos decidir que la Bolsa
cuando se crea se le pueda pasar una lista inicial de productos.
24. package com.arquitecturajava;
import java.util.ArrayList;
import java.util.List;
public class Bolsa {
private List<Producto> lista = new ArrayList<Producto>();
public Bolsa() {
super();
}
public Bolsa(List<Producto> lista) {
super();
this.lista = lista;
}
public void addProducto(Producto p) {
lista.add(p);
}
public void addProducto(String nombre, double precio) {
lista.add(new Producto(nombre, precio));
}
public void addProductos(List<Producto> productos) {
lista.addAll(productos);
}
public void addProductos(Producto... productos) {
for (Producto f : productos) {
lista.add(f);
}
}
}