Java Tema 5
Funciones
Una función es un trozo de código con nombre que puedes usar todas las veces que quieras, solo con escribir ese nombre. Es como una receta: se escribe una vez, y cada vez que quieres el plato, la sigues.
Sirven para tres cosas:
| Para… | Ejemplo |
|---|---|
| No repetir código | Si saludas en cinco sitios del programa, escribes el saludo una vez y lo llamas cinco veces |
| Dividir un problema grande en partes pequeñas | Un juego se puede repartir en pedirJugada(), comprobarGanador(), mostrarTablero()… |
| Leer mejor el código | if (esPar(numero)) se entiende a la primera |
Crear y usar una función#
Una función se escribe fuera del main, pero dentro de la clase. Para usarla (se dice llamarla), se escribe su nombre con paréntesis:
public class Saludos {
static void saludar() {
System.out.println("¡Hola! Bienvenido a Codemaker");
}
public static void main(String[] args) {
saludar();
saludar();
}
}void saludar() {
IO.println("¡Hola! Bienvenido a Codemaker");
}
void main() {
saludar();
saludar();
}El programa imprime el saludo dos veces. Las partes de static void saludar() son:
| Parte | Qué significa |
|---|---|
static | Por ahora, ponlo siempre (en Java 21). Lo entenderás en el tema de objetos. En Java 25, con void main(), no hace falta |
void | La función no devuelve ningún resultado: solo hace algo |
saludar | El nombre. Suele ser un verbo, y se escribe como las variables: calcularMedia, mostrarMenu |
() | Aquí van los datos que recibe la función (en este caso, ninguno) |
{ … } | El código que se ejecuta cada vez que se llama |
Parámetros: darle datos a la función#
Entre los paréntesis se ponen los parámetros: variables que la función recibe desde fuera cada vez que se la llama.
static void saludar(String nombre) {
System.out.println("¡Hola, " + nombre + "!");
}
// Dentro del main:
saludar("Ana"); // ¡Hola, Ana!
saludar("Hugo"); // ¡Hola, Hugo!Puede recibir varios, separados por comas, cada uno con su tipo:
static void repetir(String texto, int veces) {
for (int i = 0; i < veces; i++) {
System.out.println(texto);
}
}
// Dentro del main:
repetir("Java mola", 3);Importante
Al llamar a la función hay que darle los datos en el mismo orden y del mismo tipo que los parámetros. repetir(3, "Java mola") da error: primero va el texto y después el número.
Devolver un resultado: return#
Muchas funciones calculan algo y lo devuelven. En lugar de void se pone el tipo de lo que devuelve, y dentro, return con el valor:
static int doble(int n) {
return n * 2;
}
// Dentro del main:
int resultado = doble(5); // resultado vale 10
System.out.println(doble(7)); // 14return termina la función en ese momento: lo que haya después ya no se ejecuta.
| Tipo de la función | Qué devuelve | Ejemplo | Cómo se usa |
|---|---|---|---|
void | Nada | static void saludar() | saludar(); |
int | Un entero | static int doble(int n) | int d = doble(5); |
double | Un decimal | static double media(int a, int b) | double m = media(4, 7); |
boolean | true o false | static boolean esPar(int n) | if (esPar(8)) { … } |
String | Un texto | static String saludo(String nombre) | String s = saludo("Ana"); |
Las que devuelven boolean quedan muy claras dentro de un if:
static boolean esPar(int n) {
return n % 2 == 0;
}
// Dentro del main:
if (esPar(8)) {
System.out.println("Es par");
}¿Función, procedimiento o método?#
Vas a oír los tres nombres. Son casi lo mismo:
| Nombre | Qué es | Ejemplo |
|---|---|---|
| Función | Calcula algo y lo devuelve con return | static int doble(int n) |
| Procedimiento | Hace algo, pero no devuelve nada (void) | static void saludar() |
| Método | Así se llaman las dos en Java, porque siempre están dentro de una clase | doble, saludar, y también println o charAt |
Variables locales#
Una variable creada dentro de una función solo existe dentro de ella: al terminar la función, desaparece. Por eso dos funciones distintas pueden tener variables con el mismo nombre sin estorbarse.
static void contar() {
int total = 10; // solo existe dentro de contar()
System.out.println(total);
}
public static void main(String[] args) {
contar();
// System.out.println(total); ← error: aquí total no existe
}Si main necesita un dato que calcula otra función, la forma correcta es que la función lo devuelva con return.
Un ejemplo completo#
Funciones que reciben un array y calculan cosas con él:
public class Notas {
static double media(int[] notas) {
int suma = 0;
for (int i = 0; i < notas.length; i++) {
suma += notas[i];
}
return (double) suma / notas.length;
}
static int aprobados(int[] notas) {
int cuantos = 0;
for (int i = 0; i < notas.length; i++) {
if (notas[i] >= 5) {
cuantos++;
}
}
return cuantos;
}
public static void main(String[] args) {
int[] notas = {7, 4, 9, 6, 3};
System.out.println("Media: " + media(notas)); // Media: 5.8
System.out.println("Aprobados: " + aprobados(notas)); // Aprobados: 3
}
}double media(int[] notas) {
int suma = 0;
for (int i = 0; i < notas.length; i++) {
suma += notas[i];
}
return (double) suma / notas.length;
}
int aprobados(int[] notas) {
int cuantos = 0;
for (int i = 0; i < notas.length; i++) {
if (notas[i] >= 5) {
cuantos++;
}
}
return cuantos;
}
void main() {
int[] notas = {7, 4, 9, 6, 3};
IO.println("Media: " + media(notas)); // Media: 5.8
IO.println("Aprobados: " + aprobados(notas)); // Aprobados: 3
}Fíjate en el (double) de la media: sin él, 29 / 5 sería una división entre enteros y daría 5, no 5.8.
Errores frecuentes#
| Mensaje o síntoma | Qué significa | Cómo se arregla |
|---|---|---|
missing return statement | La función dice que devuelve algo (int, boolean…), pero hay algún camino por el que termina sin return | Asegúrate de que todos los caminos acaban en return, también el else |
non-static method saludar() cannot be referenced from a static context | Llamas desde main a una función sin static | Añade static a la función: static void saludar() |
method doble in class Notas cannot be applied to given types | La llamada no tiene los datos que pide la función: faltan, sobran o van en otro orden | Compara la llamada con los parámetros de la función |
incompatible types: String cannot be converted to int | Le pasas a la función un dato de otro tipo: doble("3") | Pasa el tipo que pide el parámetro: doble(3) |
illegal start of expression | Has escrito una función dentro del main | Sácala fuera del main, dentro de la clase |
| La función «no hace nada» | Has llamado a una función que devuelve un valor, pero no lo guardas ni lo muestras: doble(5); | Guarda el resultado en una variable o úsalo: int d = doble(5); |