Ir al contenido
wannacode

Parámetros y return

En resumen: Un parámetro es una variable del método que recibe el valor pasado en la llamada (el argumento), y return devuelve un resultado a quien hace la llamada.

Problema

Un recibo, totales distintos

Quieres un método que imprima la última línea del recibo: «Total: … €». Pero el total es distinto en cada pedido.

Los métodos de la lección anterior imprimen siempre lo mismo. Un método printTotal() no tiene de dónde saber el total. Tampoco quieres un método aparte para cada total. Necesitas una forma de pasar el total al método cuando lo llamas.

La idea

Parámetros: lo que recibe el método

Entre paréntesis declaras lo que el método espera: un tipo y un nombre. Eso es un parámetro. Dentro del método es una variable normal.

Al hacer la llamada, pones el valor entre paréntesis. Ese valor se llama argumento.

static void printTotal(double total) {
System.out.println("Total: " + total + " €");
}
printTotal(12.5);
printTotal(4.2);
Salida
Total: 12.5 €
Total: 4.2 €

double total es el parámetro. 12.5 y 4.2 son los argumentos. Hay un solo método, y imprime totales distintos.

Si hay varios parámetros, los separas con comas. Los argumentos se pasan en el mismo orden.

Pruébalo

Por posición, no por nombre

¿Qué imprimirá el programa?

static void printLine(String item, int qty) {
System.out.println(item + ": " + qty + " uds.");
}
String coffee = "Café";
int qty = 3;
printLine(coffee, 2);
Respuesta

Problema

¿Por qué no bajó el precio?

Has escrito un método para un descuento del 10% y lo has llamado:

static void applyDiscount(double price) {
price = price * 0.9;
}
double price = 100;
applyDiscount(price);
System.out.println(price); // 100.0
Salida
100.0

El precio sigue siendo 100. El método no da ningún error, y aun así el descuento no está. ¿Adónde fue?

Míralo

El método recibe una copia

static void applyDiscount(double price) {
price = price * 0.9;
}
double price = 100;
applyDiscount(price);
System.out.println(price); // 100.0
Paso a paso, en palabras
  1. En main hay una variable price = 100.
  2. Llamas a applyDiscount(price): se reserva memoria nueva para el método.
  3. El valor se copia en su parámetro price.
  4. El método rebaja su copia: 100 * 0.9 = 90.
  5. El método termina y su memoria desaparece, junto con la copia.
  6. Y price en main sigue siendo 100.

Al llamarlo, el método no recibe la variable price en sí, sino una copia de su valor. Rebaja la copia. Cuando el método termina, su memoria desaparece, y la copia con ella. Esto se llama paso por valor.

Las dos variables se llaman igual (price) a propósito: es justo lo que confunde en la práctica. El nombre no importa. Cada método tiene sus propias variables.

La idea

return: el método devuelve un resultado

La solución es que el método devuelva el nuevo precio. Antes del nombre, en lugar de void, escribes el tipo del resultado (double), y en el cuerpo escribes return y el valor.

static double applyDiscount(double price) {
return price * 0.9;
}
double price = 100;
price = applyDiscount(price);
System.out.println(price); // 90.0
Paso a paso, en palabras
  1. En main: price = 100.
  2. Llamas a applyDiscount(price): se reserva memoria para el método.
  3. El valor se copia en el parámetro price.
  4. return price * 0.9: el resultado es 90.
  5. El resultado vuelve a main y se guarda en price.
  6. Ahora price en main es 90.

La llamada applyDiscount(price) ahora es un valor. Puedes guardarlo en una variable (como aquí), imprimirlo o hacer cálculos con él.

Más precisamente, para curiosos
  • En un método void también puedes escribir return; (sin valor). Simplemente termina el método.
  • En Java, los argumentos siempre se pasan por valor. Con los objetos (el módulo «Clases y objetos»), lo que se copia es el enlace al objeto, así que allí los cambios se ven también fuera. Lo veremos entonces.

Pruébalo

¿Cuál es el resultado?

El método calcula un IVA del 20% sobre el precio. ¿Qué tipo tiene que ir en el hueco?

static  vat(double price) {
    return price * 0.2;
}

Pruébalo

Devuelto, pero perdido

¿Qué imprimirá el programa?

static int reserve(int seats) {
seats = seats - 2;
System.out.println("dentro: " + seats);
return seats;
}
int seats = 10;
reserve(seats);
System.out.println("fuera: " + seats);
Respuesta

La idea

return termina el método

La tienda no cobra el envío en los pedidos de 50 € o más. Si no, el envío cuesta 4,99 €:

static double shippingCost(double total) {
if (total >= 50) {
return 0;
}
return 4.99;
}
System.out.println(shippingCost(62.0));
System.out.println(shippingCost(18.5));
Salida
0.0
4.99

En cuanto llega a return, el método termina en ese momento. Por eso, con 62 €, el segundo return no se ejecuta, y no necesitamos un else.

Un método con resultado tiene que devolver un valor en cada camino. Si quitas la última línea, el programa no compila: "missing return statement".

Pruébalo

Encuentra el error

Los socios del club tienen un 10% de descuento, y los demás pagan el precio completo. Pero todos reciben el descuento. ¿En qué línea está el error?

Elige la línea con el error.

Ejercicio

Métodos que calculan

Resuelve las tareas en tu editor. Cada método recibe lo que necesita como parámetros y devuelve el resultado. La impresión se hace en main.

1. Media aritmética. El método average(int[] values) devuelve la media de los números del array. En main, lee del teclado cuántos números hay y después los números.

Entrada
5
10
15
20
25
30
Salida
Media: 20.0

2. Número primo. El método isPrime(int n) devuelve si el número es primo (divisible solo por 1 y por sí mismo). Para 7 devuelve true, para 12 false.

3. Temperaturas. Los métodos toFahrenheit(double c) y toCelsius(double f). F = C · 9 / 5 + 32. Lee una temperatura y una unidad (C o F) e imprime la temperatura convertida.

Entrada
100
C
Salida
100.0 C = 212.0 F

4. Calculadora. El método calculate(double a, double b, char op) devuelve el resultado para +, -, * o /. La operación se elige con if.

Entrada
10
5
+
Salida
10.0 + 5.0 = 15.0

5. Un triángulo con parámetro. Lo prometimos en la lección anterior. El método printTriangle(int height) imprime un triángulo rectángulo de asteriscos con altura height. Para 3:

Salida
*
* *
* * *
Más precisamente, para curiosos

Cuidado con 5 / 9 en la fórmula de Celsius. Los dos números son enteros, así que la división es entera y el resultado es 0. Escribe (f - 32) * 5 / 9: así f - 32 es un double y todo el cálculo se hace con decimales.

Ejercicio

Métodos para arrays

Cada tarea es un método que recibe un array (o una palabra) y devuelve un resultado. Al final, júntalos todos en un programa.

  1. sum, sumEven y sumOdd: la suma de todos los números, de los pares y de los impares del array.
  2. reverse: devuelve un array nuevo con los números en orden inverso.
  3. max y min: el número mayor y el menor.
  4. isPalindrome(String word): si la palabra se lee igual de izquierda a derecha que de derecha a izquierda.
  5. sumDiagonals y sumDiagonalsOnce: la suma de las dos diagonales de una matriz cuadrada, contando el elemento central dos veces y una vez.
  6. Todo junto: para el array { 1, 2, 3, 4, 5 }, el número 7 (con isPrime de la tarjeta anterior), las palabras «radar» y «ABCDE» y la matriz de 3 × 3 con los números del 1 al 9.
Salida de la tarea 6
Suma: 15, Pares: 6, Impares: 9
Invertido: [5, 4, 3, 2, 1]
Máx: 5, Mín: 1
7 es primo: true
radar: true, ABCDE: false
Suma con repetición: 30, Suma sin repetición: 25

Test

Ponte a prueba

1. En static double vat(double price), ¿cuál es el parámetro?
2. Un método cambia su parámetro. ¿Qué pasa con la variable que pasaste en la llamada?
3. ¿Qué hace return?
4. Un método se declara con el tipo double. ¿Qué tiene que cumplirse?
5. ¿Qué hace la línea price = applyDiscount(price);?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·