Академический Документы
Профессиональный Документы
Культура Документы
- Métodos 1
TEMARIO DE CURSO
PROGRAMACIÓN JAVA SE
Iñaki Martín
CAPÍTULO 5
rt í
MÉTODOS (FUNCIONES)
n
M a
©
ik
a
Temario de curso JavaSE
Iñ
©
© Iñaki Martín
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional.
5.- Métodos Métodos: Resumen 2
métodos
MODIFICADOR DE ACCESO TIPO RESULTADO (Retorno)
• Public -Todo el mundo puede invocar el método • Si no da ningun resultado, debe indicarse void
• Private -Solo invocable desde dentro de la clase • Si no da un resultado, debe indicarse su tipo (int, String, Coche, double …)
• Protected - Solo invocable desde la clase y sus herederas • Si no da un resultado, debe incluir la instrucción return seguida del valor
• (sin nada) -Solo invocable desde dentro del paquete
Iñaki Martín
rt ín
a
Scanner sc = new Scanner(System.in);
String texto = sc.nextLine();
M
return texto;
©
PARAMETROS
ik
} • Para cada uno se indica el tipo y una variable
donde se recibirá el argumento
a
Temario de curso JavaSE
Iñ
• Es obligatorio si se llama a este método desde otro método que sea static • En la práctica, recibe la información por valor si el
• Permite invocar al método sólo con el nombre de la clase tipo es primitivo, y por referencia si es un objeto (*)
métodos:
๏ Un método sobrecargado:
reglas sobrecarga
๏ Si en un programa tenemos una serie de instrucciones que repiten varias veces, ¿por qué no agruparlas y
aislarlas, darles un nombre, y llamarlas para que se realicen cuando se las necesite, en vez de escribirlas
varias veces?
๏ También, a veces, se desea dividir el código en trozos aislados, bien sea por separar e identificar mejor las
Iñaki Martín
n
diferentes actividades, bien porque alguno de los trozos se desee individualizar para reutilizarse en el futuro.
rt í
a
๏ Un método es un miniprograma, un conjunto de instrucciones agrupadas, dentro de una clase, a las que
M
©
se da un nombre, y que realizan una determinada tarea. A este conjunto de instrucciones se le puede llamar
luego mediante su nombre.
ik
a
Temario de curso JavaSE
๏ Cuando se llama a un método, la ejecución del programa pasa al método y cuando éste acaba, la ejecución
Iñ
continúa a partir del punto donde se produjo la llamada.
©
๏ Los métodos permiten, entre otras ventajas:
- separar las operaciones en módulos, aislados y más fáciles de comprender
- reutilizar código, pues si unas operativas son repetitivas, se repitan varias veces, puedo escribirlas solo
una vez y llamarlas tantas veces como quiera
5.- Métodos Creando métodos (I) 4
๏ Este ejemplo ilustra el caso de una serie de instrucciones que, inicialmente, se repiten varias veces, pero que se
han agrupado, y aislado en un método ( llamado pedir ) , al que se llama cuando se necesita
public static void main(String args[]){ public static void main(String args[]){
Scanner entrada = new Scanner(System.in); int a = 0, b = 0, c = 0, suma = 0;
Iñaki Martín
n
suma = suma + a;
í
System.out.println("Dime un numero"); b= pedir();
rt
a = entrada.nextInt(); suma = suma + b;
if (a < 0) { c= pedir();
System.out.println("no puede ser negativo"); suma = suma + c;
a
} System.out.println("la suma de los tres es " + suma);
} while (a < 0); }
M
suma = suma + a;
©
do {
ik
System.out.println("Dime un número"); public static int pedir() {
b = entrada.nextInt(); Scanner entrada = new Scanner(System.in);
if (b < 0) { int x = 0;
a
Temario de curso JavaSE
Iñ
System.out.println("Dime un número");
} while (b < 0); x = entrada.nextInt();
suma = suma + b; if (x < 0) {
do { System.out.println("no puede ser negativo");
©
System.out.println("Dime un número"); }
c = entrada.nextInt(); } while (x < 0);
if (c < 0) { return x;
System.out.println("no puede ser negativo"); }
}
} while (c < 0);
suma = suma + c;
System.out.println("la suma de los tres es " + suma);
}
5.- Métodos Creando métodos (I) 5
Crear métodos
๏ Los métodos deben escribirse dentro de una clase. Su contenido esta delimitado entre llaves ( { } ), con lo que queda
claro dónde están sus límites.
๏ El subprograma main que se ha usado hasta ahora es, en realidad, un método, uno que escribimos dentro de nuestra
clase. Es un método especial porque es el punto de entrada al programa, eso es, cuando se manda ejecutar un
Iñaki Martín
programa Java busca un método llamado main, y por ahí empieza a leer instrucciones.
ín
๏ Nuestros métodos, pues, se escribirán dentro la clase, fuera del main, y al mismo nivel que éste.
rt
๏ Al crear un método, éste es el formato que hay que usar (el contenido entre [ ] es opcional ):
Los modificadores de un método son parecidos
ik
opcional, imaginamos por ahora que no se usa (bueno, hay que poner la palabra void,
protected). Se verán en próximos capítulos luego veremos por qué)
a
Temario de curso JavaSE
Iñ
// … (instrucciones del método)
// }
๏ Este es nuestro primer método, consiste en algo muy simple que pide un texto por teclado y lo imprime en mayusculas:
void saludar() {
System.out.println("Dame tu nombre y yo te lo imprimo en mayusculas...");
Scanner sc = new Scanner(System.in);
String texto = sc.nextLine();
System.out.println(texto.toUpperCase());
}
5.- Métodos Creando métodos (III) 6
saludar();
Iñaki Martín
n
๏ Leer atentamente este ejemplo, ejecutarlo y evaluar los resultados:
rt í
a
public class Inicio {
public static void main(String[] args) {
M
©
ik
System.out.println("Estas lineas se ejecutan antes de llamar al método");
saludar();
a
Temario de curso JavaSE
Iñ
System.out.println("Estas lineas se ejecutan despues de llamar al método");
System.out.println("Ultima linea del programa");
}
©
public static void saludar() {
System.out.println("-- Esta es la primera linea del método que se ejecuta");
๏ Por supuesto, dentro de un método, se puede llamar a otro método, y dentro de este a otro…
5.- Métodos Creando métodos (IV) 7
๏ A los métodos, además de decirles "Haz lo que dice aquí ", se les puede decir también :
"Haz lo que dice aquí, pero cuidado que además te paso esta información por si la quieres usar”. Esto es
lo que se llama parámetros de entrada
Iñaki Martín
"Haz lo que dice aquí, pero cuidado que cuando acabes, me voy a quedar esperando que me des un
rt ín
resultado, alguna información a mi”. Esto es el llamado valor de resultado (o de retorno), y se dice que el
método da como resultado un valor, un valor de retorno
M a
๏ Se pueden combinar ambos casos, de modo que un método puede "recibir información adicional
©
ik
(parámetros) para usarla si lo desea, y a la vez, dar como resultado un valor al sitio desde donde se le
llamó inicialmente"
a
Temario de curso JavaSE
Iñ
Se envían datos para que el
método los use
int solucion
© = sumarNumeros(4,6);
๏ Cuando un método necesita información, y no puede acceder a ella, puede pedir que ser le envíe dicha
información por medio de los parámetros de entrada.
Iñaki Martín
๏ ¿Cómo se definen los parámetros? En el método, cuando se escribe en la clase se debe especificar (entre
los paréntesis) para cada parámetro:
✴ tipo de dato que se espera recibir en el futuro
rt ín
nombre interno con el que vamos a llamar a lo que venga
a
✴
M
©
ik
➡ Ejemplo: void mimetodo ( String unavariable ){
...
a
Temario de curso JavaSE
Iñ
๏ Se pueden poner varios parámetros separados por coma, y pueden ser de diferente tipo:
Ejemplo:
©
➡ void mimetodo ( String unavariable, Coche uncoche){
...
}
๏ El tipo de dato puede ser un tipo primitivo, o una clase Java o propia (depende de lo que se desee recibir)
➡ Ejemplo: void mimetodo ( String unavariable, int otravar ){
…
}
5.- Métodos Usando métodos con parámetros (I) 9
๏ Ejemplo: Imaginemos que al método que se vio antes que leía un String por teclado, le vamos a añadir que
antes de hacer esta petición, muestre un mensaje, pero no siempre el mismo, sino el texto que se le pase
como parámetro:
rt ín
a
Scanner sc = new Scanner(System.in);
String texto = sc.nextLine();
M
©
System.out.println(texto);
ik
}
a
Temario de curso JavaSE
Iñ
๏ Se denomina firma de un método a la composición de:
©
‣ nombre del método
‣ tipo de los parámetros.
En el método anterior, la firma es pues
leerCadena(String mensaje)
rt ín
a
// Llamada al método NO llevan el tipo de dato
sumar( 3 , 4 ); argumentos
M
}
©
a
Temario de curso JavaSE
Iñ
} a = 3;
} b = 4;
©
public static void main(String[] args) { argumentos
๏ No tienen nada que ver la variable con la que se int valor1 = 7;
int valor2 = 5;
llama a un método (argumento), con la variable sumar( valor1, valor2 );
que recibe el valor del método (parámetro), }
pueden llamarse igual o no, no tiene importancia, son public static sumar( int a,int b ) {
System.out.println(a + b);
parámetros
variables diferentes. }
A menudo se usan indistintamente las palabras parámetros y argumentos, deberían distinguirse cómo se ha explicado.
También se llaman “parámetros actuales” a los argumentos, y “parámetros formales” a los parámetros. Por no complicar mucho al alumno, se
puede usar en estos apunte, sobre todo en los primeros capítulos, el término parámetro para ambos elementos.
5.- Métodos Usando métodos con parámetros (II) 11
n
String unacadena = "Introduzca un texto, por favor:";
í
leerCadena(unacadena);
rt
// opcion 2, pasamos al método un String directamente
a
leerCadena("Introduzca otro texto, por favor:");
}
M
©
// Método que recibe un string como parámetro (o argumento), lo imprime y luego pide
ik
// por teclado una cadena, que tambien imprime
public static void leerCadena(String mensaje) {
System.out.println(mensaje);
a
Temario de curso JavaSE
Iñ
String texto = sc.nextLine();
System.out.println(texto);
}
}
CUIDADO ©
Si desde dentro de un método con el modificador static se llama a otro método, o se usa
un atributo de clase, el método y el atributo llamados también han de tener el
modificador static (se explicará el por qué más adelante)
Esto ocurre por tanto con todos los métodos static, y recordar que main es uno de ellos,
así que todo método invocado desde main ha de ser static
5.- Métodos Usando métodos con parámetros (III) 12
๏ Vamos a coger el método de ejercicios anteriores, public static void leerCadenaAcotada(String mensaje, int max) {
que elida una cadena por consola, y vamos a hacer System.out.println(mensaje);
Scanner sc = new Scanner(System.in);
que reciba dos parámetros, además del mensaje String texto = sc.nextLine();
if (texto.length() > max) {
que ya tenía, un int que usaremos para validar que System.out.println("Cadena muy larga, maximo : "+ max);
} else {
Iñaki Martín
n
(el int será el número máximo de caracteres que se
í
}
rt
}
puedan leer). El nuevo método se llamara
leerCadenaAcotada:
ik
el tipo correcto, y el número correcto de ellos
a
Temario de curso JavaSE
Iñ
el programa principal dice: “Llamar a un método llamado leerCadenaAcotada y ADEMÁS, le envió esta
información: “Introduzca un texto” y 20 (UN STRING, Y UN INT)”
y luego buscará si realmente existe un método que se llame así y que:
©
• tenga esos parámetros, solo dos, y
• con esos tipos de datos, y
• en ese orden.
๏ Para definir un valor de resultado (retorno) en un método, hay que hacer dos cosas:
✴ En la definición del método, poner delante del nombre del método
Iñaki Martín
a
return resultado;
instrucción que sea }
M
return valorderesultado
©
ik
donde return es una palabra clave de java, y valorderesultado, lo
que queremos dar como resultado al programa que ha llamado al
a
Temario de curso JavaSE
método.
Iñ
๏ la palabra clave void se debe incluir si nuestro método no ha de devolver nada como resultado.
resultado alguno).
๏ Cambiamos el método
©
void significa “no da ningún resultado” (es lo que pasaba en nuestros métodos anteriores, no daban
๏ Para llamar a un método que tiene un valor de resultado, hay que considerar que el método, tras ejecutarse,
se convierte en una información, la que el método da como respuesta.
๏ Es como cualquier operación, que tambien da una respuesta. Si yo escribo
Iñaki Martín
4 + 8
rt
el programa dirá “vale, ok, son 12…. ¿¿¿ qué hago con ese resultado, con ese 12 ???”
ín
Evidentemente, lo que solemos hacer es guardar la respuesta en alguna variable, imprimir la respuesta….
int numero = 4 + 8;
M a
©
ik
System.out.println(4 + 8);
a
Temario de curso JavaSE
๏ De igual modo, un método que tiene un valor de resultado, al acabar, da como resultado una información
Iñ
(la que hay tras la instrucción return antes vista), ”retorna” un valor, por lo que hay que hacer algo con ella.
๏ Algunos ejemplos de como llamar al método leerCadena desde el programa main: Llamada al método que devuelve un
©
valor y lo guardo en una variable
String cadenaleida = leerCadena("Introduzca un texto, por favor:") ; Llamada al método que devuelve un
System.out.println("La cadena leida es : " + cadenaleida) ; valor y lo imprimo
๏ Si un método ha de dar como resultado un valor, y no tiene orden boolean ponerColor (String parámetroColor) {
return, falla. También falla si el compilador prevé que puede que boolean respuesta;
if (parámetroColor.equals ("Amarillo")) {
no se llegue nunca a una orden return. Por ejemplo, este respuesta = true;
return respuesta;
método falla al compilar. }
Iñaki Martín
}
¿Por qué? porque si se llama al método y se le pasa un
ín
parámetro que no sea “Amarillo”, no se cumple la condición del if, El parámetro del método indica que se debe recibir
rt
con lo que el return no se ejecuta, y no hay otro return… un valor de tipo array (int [] ) y el nombre con el que
se usará dentro del método (arr)
M a
©
ik
) {
puede ser usado como argumento o como valor de resultado int[] otroarr = new int [1];
• Como argumento se le pasa el nombre del array
a
otroarr[0]= 65;
Temario de curso JavaSE
Iñ
Recordar que en un array de int llamado X, }
- X es el nombre del array Al definir el método, el tipo
de dato que devuelve es el
©
- int[] es el tipo de la variable X // Llamada al método desde fuera
tipo del array: int[]
- X[0] es un elemento del array int[] unarr = new int [2];
int[] otroarra =
El valor devuelto por el nuevoarray(unarra);
método debe ser un array
(su nombre)
Sobrecarga
๏ Esta técnica permite que existan varios métodos con el mismo nombre, normalmente, bien por que:
‣ se quiere que actúen de modo diferente según los parámetros que lleven
‣ se quiere que hagan lo mismo, pero que funcionen con cualquier tipo de parámetro.
Esto se ve en muchísimos métodos de Java base, cuando un método hace lo mismo independientemente de que el parámetro que
Iñaki Martín
se le pase sea String, int, boolean u otro tipo. Un ejemplo claro es el método archiusado hasta ahora, println() (con System.out). Este
ín
método funciona tanto si se le pasa un String, como un int, como un float o un boolean, y esto es así porque realmente existen
rt
definidos (ya se verá dónde) los métodos: println(String k) {…}
println(int k) {…}
a
println(boolean k) {…}
……
M
©
Así, si se llama a println con un argumento String, se ejecuta el primero de los métodos, si se llama con un argumento int, se
ik
ejecuta el segundo, si se llama con un boolean, se ejecuta el tercero… y todos ellos tienen la misma funcionalidad.
a
Temario de curso JavaSE
๏ Para poder sobrecargar un método han de tener diferente firma, esto es, deben ser diferentes el número, o el
Iñ
tipo, o el orden de los parámetros.
๏ El tipo del resultado de los métodos no influye en la sobrecarga, puede ser el mismo o distinto, es indiferente.
public int
public String test ()
public int
©
๏ Ejemplos: Estas declaraciones de métodos si pueden coexistir en la misma clase:
test (int a) { … }
{ … }
test (String s) { … }
En java no existe sobrecarga de operadores, solo
una excepción, y está ya implementada por el
compilador, que es “+”, que vale para sumar
pero este no puede añadirse números y para concatenar cadenas.
public int test (int z) { … }
Esto es fácil de entender si pensamos como piensa el traductor de Java a la hora de ejecutar un programa. Si queremos tener en
nuestra clase dos métodos con la misma firma, cuando luego desde el main u otro método quisiéramos llamar a uno de estos métodos,
el compilador de Java buscaría el método y encontraría dos iguales .... ¿A cuál de ellos habría de invocar? No podría saberlo.…
5.- Métodos Parámetros Variables (VarArgs) (I) 17
๏ Hemos visto que un método puede recibir varios parámetros, pero siempre un numero fijo de ellos.
๏ Si el número de parámetros no es conocido, se puede pasar un array (o colección) como parámetro, como en este ejemplo:
public String concatenar(String [] cadenas) {
String res = "";
for (int i=0; i< cadenas.length ; i++) {
Iñaki Martín
n
}
í
return res;
rt
}
a
y llamar así al método: String [] pruebas = {"Lunes","Miercoles","Viernes"};
String sol = concatenar(pruebas);
M
©
ik
๏ Pero desde Java SE 5.0 se permite el uso de varargs, argumentos variables, de este modo (con el mismo ejemplo anterior);
public String concatenar(String ... cadenas) {
a
Temario de curso JavaSE
Iñ
for (int i=0; i< cadenas.length ; i++) {
res = res + cadenas [i];
}
return res;
©
}
๏ Parece que no simplifica mucho, pero sí se simplifica en la llamada al método, evitándonos crear arrays o colecciones;
String sol = concatenar("Lunes","Miercoles","Viernes");
๏ Se puede usar varargs junto con otros public String concatenarHasta(int cantidad, String ... cadenas) {
parámetros, aunque con ciertas limitaciones: String res = "";
for (int i=0; i< cantidad ; i++) {
- podemos declarar varios parámetros simples res = res + cadenas [i];
}
pero sólo podemos declarar un vararg (por return res;
}
método, claro) y, además,
- el vararg debe ser el último de los parámetros:
5.- Métodos Parámetros Variables (VarArgs) (II) 18
๏ A la hora de usar parámetros variables, hemos de tener en cuenta que no se pueden realizar ciertas acciones
๏ Ya sabemos que no se puede sobrecargar métodos si tienen la misma firma, y en esto hay que tener cuidado con
parámetros variables. Esto NO compila, pues los dos métodos están esperando recibir lo mismo, una lista variable de Strings
Iñaki Martín
n
// lineas de código
í
}
rt
void concatenar(String [] variosStrings) {
a
// lineas de código
}
M
©
ik
๏ Esto es también erróneo, pues nuevamente los dos métodos están esperando recibir lo mismo, una lista variable de Strings
void concatenar(String... variosStrings) {
a
Temario de curso JavaSE
// lineas de código
Iñ
}
©
}
๏ Constatar que se puede hacer un método que reciba un numero indeterminado… de arrays (u otra colección) :
void acumular(String [] ... grupos ) {
// lineas de código
}
๏ Eso si, dentro de una declaración SOLO puede haber un parámetro var-args… :
๏ Como curiosidad, con esta funcionalidad se puede cambiar la firma del famoso método main, pasando de
void main (String[] args)
a poder usarse sin el menor problema como
void main (String … args)