Codemaker Java

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ódigoSi saludas en cinco sitios del programa, escribes el saludo una vez y lo llamas cinco veces
Dividir un problema grande en partes pequeñasUn juego se puede repartir en pedirJugada(), comprobarGanador(), mostrarTablero()…
Leer mejor el códigoif (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();
    }
}

El programa imprime el saludo dos veces. Las partes de static void saludar() son:

ParteQué significa
staticPor ahora, ponlo siempre (en Java 21). Lo entenderás en el tema de objetos. En Java 25, con void main(), no hace falta
voidLa función no devuelve ningún resultado: solo hace algo
saludarEl 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.

Java
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:

Java
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:

Java
static int doble(int n) {
    return n * 2;
}

// Dentro del main:
int resultado = doble(5);              // resultado vale 10
System.out.println(doble(7));          // 14

return termina la función en ese momento: lo que haya después ya no se ejecuta.

Tipo de la funciónQué devuelveEjemploCómo se usa
voidNadastatic void saludar()saludar();
intUn enterostatic int doble(int n)int d = doble(5);
doubleUn decimalstatic double media(int a, int b)double m = media(4, 7);
booleantrue o falsestatic boolean esPar(int n)if (esPar(8)) { … }
StringUn textostatic String saludo(String nombre)String s = saludo("Ana");

Las que devuelven boolean quedan muy claras dentro de un if:

Java
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:

NombreQué esEjemplo
FunciónCalcula algo y lo devuelve con returnstatic int doble(int n)
ProcedimientoHace algo, pero no devuelve nada (void)static void saludar()
MétodoAsí se llaman las dos en Java, porque siempre están dentro de una clasedoble, 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.

Java
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
    }
}

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íntomaQué significaCómo se arregla
missing return statementLa función dice que devuelve algo (int, boolean…), pero hay algún camino por el que termina sin returnAsegúrate de que todos los caminos acaban en return, también el else
non-static method saludar() cannot be referenced from a static contextLlamas desde main a una función sin staticAñade static a la función: static void saludar()
method doble in class Notas cannot be applied to given typesLa llamada no tiene los datos que pide la función: faltan, sobran o van en otro ordenCompara la llamada con los parámetros de la función
incompatible types: String cannot be converted to intLe 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 expressionHas escrito una función dentro del mainSá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);