Sobrecarga en Java
Pon en una clase dos métodos que usen ambos el nombre paint. Un encabezado es static void paint(String word). El otro es static void paint(int n). Los cuerpos son cortos: el primero imprime word, el segundo imprime n. Desde main llama paint("ok"); y después paint(3);. La pantalla debe mostrar dos líneas: ok en la primera y 3 en la segunda. Java no trata el segundo paint como un choque. Ve los dos encabezados como métodos distintos porque las listas de parámetros difieren. Ese nombre compartido con listas distintas es lo que enseña esta página.
Mismo nombre, listas distintas
Hasta ahora cada idea nueva usaba un nombre de método fresco: ring, greet, twice. Aquí el nombre se queda en paint a propósito. Lo que cambia es lo que hay entre los paréntesis. Una lista guarda un String. Otra guarda un int. El compilador conserva ambos porque esas listas no son iguales.
Crea un archivo de programa pequeño llamado Sign.java. El public class de la primera línea debe coincidir con el nombre del archivo: public class Sign. No dejes un nombre de clase antiguo Box o Tip en este archivo; el compilador espera que el nombre de la clase y el del archivo coincidan.
Fuera de main, todavía dentro de las llaves de la clase, escribe ambos encabezados paint. En esta página mantén void: cada cuerpo imprime y nada tiene que volver a main con return. El primer cuerpo usa System.out.println(word);. El segundo usa System.out.println(n);. Guarda el archivo antes de compilar. El primer programa completo está en el siguiente cuadro.
Sign.java con dos métodos paint
Esta es la versión que compilas primero. main tiene dos llamadas. La clase tiene dos métodos paint que comparten nombre.
public class Sign {
public static void main(String[] args) {
paint("ok");
paint(3);
}
static void paint(String word) {
System.out.println(word);
}
static void paint(int n) {
System.out.println(n);
}
}
Desde la carpeta que guarda Sign.java, ejecuta javac Sign.java. Cuando paréntesis, llaves y puntos y coma coinciden, javac no escribe una línea propia. Luego ejecuta java Sign — no java Sign.java. Quita la terminación .java del segundo comando. Los mismos dos comandos funcionan en Windows y en macOS. El programa debe imprimir dos líneas y parar: ok y luego 3. No debe pedirte que escribas. Si la terminal espera entrada de teclado, aún queda una llamada nextLine de un ejercicio anterior. Bórrala y conserva las dos llamadas paint más los dos métodos paint de arriba.
Recorre la ejecución una vez en orden. Java empieza en main. La primera llamada es paint("ok"). El argumento es un String, así que Java ejecuta el cuerpo que toma String word e imprime ok. La segunda llamada es paint(3). El argumento es un int, así que Java ejecuta el cuerpo que toma int n e imprime 3. El nombre paint es el mismo las dos veces. La lista entre paréntesis es lo que elige el cuerpo.
Si ambas líneas muestran ok, quizá dejaste solo el método String e imprimiste una palabra fija en cada llamada. Si ambas muestran 3, quizá dejaste solo el método int. Conserva ambos encabezados. Si javac dice que paint ya está definido, comprueba si ambos encabezados tienen la misma lista — por ejemplo dos copias de paint(String word). La sobrecarga necesita una diferencia real en la lista, no una segunda copia del mismo encabezado solo con otro nombre de parámetro.
Una segunda lista con dos palabras
El número de parámetros también puede diferir. Añade una tercera sobrecarga que tome dos valores String y los imprima en una línea con un espacio. Deja los dos primeros métodos paint en su sitio. Llama la nueva forma desde main después de las llamadas anteriores, o empieza un main nuevo centrado en esta forma mientras la aprendes.
public class Sign {
public static void main(String[] args) {
paint("hi", "sam");
}
static void paint(String a, String b) {
System.out.println(a + " " + b);
}
}
Compila y ejecuta otra vez después de guardar: javac Sign.java, luego java Sign. La pantalla debe mostrar una línea: hi sam. La llamada tiene dos argumentos. El método tiene dos parámetros. Esa coincidencia basta para que Java elija este cuerpo. Si todavía tienes paint(String word) y paint(int n) en la misma clase, puedes dejarlos. Una llamada con dos valores String no elige el método String de un argumento, porque las cantidades difieren.
Cuando pongas las tres sobrecargas en un archivo para practicar, main puede llamar cada forma en su propia línea. Una llamada con un String sigue yendo a paint(String word). Una llamada con un int sigue yendo a paint(int n). Una llamada con dos String va a paint(String a, String b). El nombre compartido no borra esas distinciones.
Lista vacía junto a una lista String
Un método con paréntesis vacíos también es una lista distinta. Puedes mantener paint() sin parámetros junto a paint(String word). La llamada vacía paint(); ejecuta el cuerpo de lista vacía. La llamada paint("go"); ejecuta el cuerpo String.
public class Sign {
public static void main(String[] args) {
paint();
paint("go");
}
static void paint() {
System.out.println("ready");
}
static void paint(String word) {
System.out.println(word);
}
}
Después de javac Sign.java y java Sign, la pantalla debe mostrar ready en la primera línea y go en la segunda. La primera llamada no tiene nada entre paréntesis, así que encaja con paint(). La segunda envía un String, así que encaja con paint(String word). Renombrar uno a paintReady también compilaría, pero esa es otra habilidad. Esta página mantiene el nombre paint y deja que las listas lleven la diferencia.
Qué llamada ejecuta qué encabezado
Lee las llamadas junto a los encabezados. La lista de argumentos en la llamada debe encajar con la lista de parámetros del encabezado. En esta forma de principiante importan el tipo y la cantidad.
📊 call beside matching paint
| Llamada en main | Encabezado que corre | Línea en pantalla |
|---|---|---|
paint("ok"); |
paint(String word) |
ok |
paint(3); |
paint(int n) |
3 |
paint("hi", "sam"); |
paint(String a, String b) |
hi sam |
paint(); |
paint() |
ready |
Un error frecuente es escribir dos métodos que digan ambos paint(String word) y esperar que el segundo cuente como sobrecarga. Solo cambiar el nombre del parámetro a paint(String label) no crea una lista nueva para el compilador. Aquí importan el tipo y la cantidad. Otro error es llamar paint(true) cuando nunca escribiste una lista de parámetros boolean. Entonces javac no encuentra un paint que encaje. Añade un encabezado que tome el tipo que quieres, o cambia la llamada a un tipo que ya admitas.
Escribir System.out.println("paint"); en main imprime la palabra paint. No llama a ningún método. Conserva paint("ok"); cuando quieras la sobrecarga que toma un String. Dejar un twice sobrante de un archivo Box antiguo en Sign.java puede confundir la pantalla si main todavía imprime twice(7). Deja main solo con las llamadas paint que estás probando, y conserva solo las sobrecargas paint que necesites para esa ejecución.
No anides un método paint dentro de las llaves de main. Los métodos van dentro de la clase, junto a main. Dos sobrecargas son dos métodos hermanos en ese mismo cuerpo de clase.
Antes de scope
Puedes mantener un nombre de método y varias listas de parámetros en la misma clase. Java elige el cuerpo según la lista de argumentos de la llamada. La pantalla muestra la línea del cuerpo que encaja. Dos encabezados con la misma lista no son sobrecargas. La página siguiente es scope; allí ves qué nombres son visibles dentro de un método y cuáles quedan fuera.
🧠 Pon a Prueba tu Conocimiento
Pon a Prueba tu Conocimiento
Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema
📝 Instrucciones
- Lee cada pregunta cuidadosamente
- Selecciona la mejor respuesta para cada pregunta
- Puedes repetir el quiz tantas veces como quieras
- Tu progreso se mostrará en la parte superior