UD 3 Métodos Java

Page 1

UD_3: Abstracción de operaciones. Métodos.

Profesor: Néstor Martínez


Índice 1. 2. 3. 4. 5.

Introducción. Funciones. Procedimientos. Paso de parámetros por valor. Ámbito de definición de los métodos.


1. Introducción.  En nuestro contexto, la abstracción de operaciones

significa hacer caso omiso de “cómo” se realizan ciertas operaciones enfatizando el “qué” es lo que hacen.  En el lenguaje Java, la abstracción de operaciones se consigue a través de los llamados métodos (que implementan operaciones dentro de una clase), de manera que unos métodos podrán invocar a otros de los que les interesará únicamente qué es lo que hacen y, en ningún caso, cómo realizan internamente la operación en cuestión.  De esta manera, el repertorio de instrucciones que ofrecen los lenguajes de programación (y Java en concreto) se amplía con la posibilidad de hacer llamadas a métodos definidos por el propio programador o por otros.


1. Introducción.  Un metodo es una parte del código que puede ser

llamado y que ejecutará una serie de instrucciones para que nuestro programa sea ejecutado.

 En Java la mayoría de instrucciones siempre

estarán dentro de un método (excepto en algunos casos que no se analizaran por el momento).


1. Introducción.  Un método es:  Un bloque de código que tiene un nombre,  Recibe unos parámetros o argumentos (opcionalmente),  Contiene sentencias o instrucciones para realizar algo (opcionalmente)  Devuelve un valor de algún tipo conocido (opcionalmente).


1. Introducción.  En

nuestro programa Principal main fue:

HolaMundo

el

public static void main(String[] args) { System.out.println("Hola Mundo!"); }

método


1. Introducción.  Ejemplos de métodos utilizados: sin y sqrt de la librería

Math.

 En todos los casos se observa que la utilización del método

nos oculta los detalles de cómo se realiza internamente la operación que se requiere.  La posibilidad de definir métodos es una herramienta de gran importancia en la programación ya que permite la abstracción de operaciones y la descomposición modular de las soluciones a problemas.


1. Introducción.  Si se observan los ejemplos descritos, se pueden

extraer algunas características comunes referentes al uso de métodos:  Todos los métodos tienen un identificador: sin, sqrt,

readInt, writeln.  Después del identificador, y entre paréntesis, figuran los parámetros del método. Los métodos también pueden NO tener parámetros, como el método nextInt.  Algunos métodos devuelven un resultado, por ejemplo sin o sqrt devuelven un resultado de tipo double, nextInt devuelve un resultado de tipo int. Otros métodos no devuelven ningún resultado explícitamente, println().


1. Introducción.  Los metodos en Java siempre estarán escritos con esa

estructura:

<modificadores> <tipo> <nombre> ( <parametros> ) { <cuerpo> } 1. MODIFICADORES: Son opciones que indicarán

el comportamiento del método al momento de la ejecución (por el momento solo usaremos public static). 2. TIPO DE RETORNO: Es el tipo de datos que serán obtenidos una vez que la ejecución del método termine (los 8 tipos de datos más void). 3. NOMBRE: Es el identificador y nombre del método. 4. PARAMETROS: La información que le enviaremos al método para que este haga lo que tiene que hacer. 5. CUERPO: Las instrucciones que nuestro método va a ejecutar.


1. Introducción.  En el ejemplo anterior HolaMundo.java:  MODIFICADORES: public static  TIPO DE RETORNO: void (Significa que no devuelve ninguna información).  NOMBRE: main  PARAMETROS: String [] args (Un vector de String que veremos más adelante).  CUERPO: System.out.println("Hola Mundo!");


1. Introducción.  Siguiendo esa misma lógica podemos definir un

método para sumar dos números decimales (El tipo de datos decimal en Java es double) a y b.  MODIFICADORES: public static  TIPO DE RETORNO: double (Porque al sumar dos

números decimales obtenemos otro numero decimal).  NOMBRE: suma  PARAMETROS: double a, double b (El método recibe dos parámetros, para realizar una función que sume dos números debemos recibir esos dos números).

 Nuestro método queda escrito de la siguiente forma y

solo nos falta definir el cuerpo, es decir, como es que nuestro método realizara la suma de esos números.


1. Introducción. A los métodos que devuelven un resultado explícitamente se les denomina funciones, a los otros, aquellos que NO devuelven ningún resultado, se les denomina procedimientos.


1. Introducción.  El programador también puede definir funciones o

procedimientos propios.  Ventajas de utilizar funciones o procedimientos:

 Ahorra esfuerzo y tiempo cuando en la resolución de un

problema se repite frecuentemente una misma secuencia de acciones.  Facilita la resolución de problemas complejos describiendo su solución en términos de subproblemas más sencillos.  Incrementa la legibilidad de los programas.


1. Introducción.  En JAVA, el método que siempre existe es el llamado

“main” ó método principal y será el encargado de llevar el control de ejecución del programa.

 Un programa siempre empieza a ejecutarse en el

método “main” o principal que, en el momento adecuado, irá invocando a otros métodos que, a su vez, pueden invocar a otros métodos (incluso un método puede invocarse a sí mismo, es la denominada “recursividad”).


1. Introducción.  A esta forma de diseñar algoritmos o programas se le

llama “Diseño descendente”, “Top Down” o por “refinamientos sucesivos” Los pasos a seguir para emplear esta metodología son: Se considera el problema como un “todo”. 2. Se divide el problema en subproblemas tales que, siendo de menor complejidad, forman parte del problema completo. 3. Se vuelve a aplicar el paso 2 a los subproblemas obtenidos hasta llegar a problemas de fácil solución o triviales. 4. Se solucionan los subproblemas “triviales” y se agregan estas soluciones para obtener la solución al problema inicial. 1.


1. Introducción.  De esta forma, el programador se concentra en

solucionar problemas de menor complejidad, tales que, la solución combinada de todos ellos, es la solución al problema completo. En Java, la solución a cada uno de estos problemas, se corresponde con un método.  Ejemplo:


1. Introducción.  Ahora para 4 números:


1. Introducción.  Se puede observar que la comparación que se realiza tres

veces es exactamente la misma, la única diferencia es qué valores se comparan en cada ocasión (a con b, c con d y max1 con max2). A esos valores podemos llamarles parámetros de la comparación y podríamos escribir un método que, de manera genérica, compare 2 números enteros y calcule el máximo de ellos. En JAVA quedaría:


1. Introducción. Solución con 4 números:

Se puede observar que se invoca o llama al método máximo 3 veces con unos datos o parámetros diferentes cada vez. Desde el punto de llamada, NO importa CÓMO el método realiza el cálculo del máximo, SÓLO importa QUÉ es lo que realiza (abstracción de operaciones).


2. Funciones. Definición y uso.  Una función es un método que define el cálculo de

un determinado valor.  Distinguiremos entre la definición de la función y la llamada a la función.  La definición de una función consta de  una cabecera,  una parte de declaraciones de variables locales,  y el bloque de instrucciones que indican el cálculo a

realizar.  El resultado de la función será devuelto mediante la instrucción return.


2. Funciones. Parámetros y resultado.  La cabecera de la función contiene la siguiente

información:

 El tipo del valor que devuelve la función.  El nombre de la función.  Entre paréntesis, los nombres de los parámetros y los

tipos de los mismos.


2. Funciones. Parámetros y resultado.  La sintaxis de la cabecera de una función en Java es:  Los parámetros que se usan en la definición de la

función (param1, param2, etc.) se llaman parámetros formales. Son nombres genéricos que serán sustituidos por los valores que se indiquen en la llamada a la función; a éstos se les denomina parámetros reales.  En el momento de la llamada, ambos tipos de parámetros han de coincidir en número y tipo (según orden de aparición).


2. Funciones. Parámetros y resultado.  El resultado que devuelve la función es el que se indica en

la instrucción return y ha de ser del tipo especificado en la cabecera tipoResultado. En una función sólo se ejecutará una instrucción “return”, aunque en el cuerpo de la misma aparezcan varias.  Ejemplo:

 El modificador static indica que la función es accesible

como parte de la clase donde se define. Más adelante en el curso se explicará detalladamente lo que esto significa.


2. Funciones. Parámetros y resultado.  Volviendo al ejemplo de la introducción que sumaba

dos números, sería una función, ya que retorna un resultado de tipo double: public static double suma( double a, double b ) { }

 El cuerpo de este método es muy simple, ya que solo

tenemos que sumar a + b y regresar el valor de esa suma. public static double suma(double a, double b) { return a + b; }


2. Funciones. Parámetros y resultado.  Tenemos ahora una función de nombre suma, que

recibe dos parámetros (a,b) y que una vez que se ejecute obtendremos un valor decimal (double).  Entonces si llamamos a nuestro método obtendremos algo más o menos así:  suma (5 , 6 ) -> DEVUELVE: 11  suma (11,12) -> DEVUELVE : 23

 Ahora, para realizar algunas pruebas lo único que

tenemos que hacer, es poner todo dentro de una clase, y colocar un método principal, el cual es el punto de inicio del programa.


2. Funciones. Parámetros y resultado.


2. Funciones. Parámetros y resultado.  Guarda el archivo con el nombre de Metodos.java,

compílalo y al ejecutarlo verás que el resultado es:  11.0  23.0


2. Funciones. Efecto de la llamada a una función.  Una llamada a una función se puede realizar siempre

que el contexto sea válido para el resultado que devuelve la función (concordancia de tipos).


2. Funciones. Efecto de la llamada a una función.  Cuando se produce una llamada a una función en un

contexto adecuado y con unos parámetros reales correctos (en numero y tipo), se realizan los siguientes pasos: Se crean los objetos locales, parámetros formales y variables locales del bloque principal que define la función. Los nuevos objetos correspondientes a los parámetros formales toman como valores los de los parámetros reales. Esta sustitución se llama paso de parámetros por valor. 2. Se ejecutan las instrucciones del cuerpo de la función y la función devuelve su valor. 3. Los objetos locales dejan de existir. 4. La ejecución del programa continúa en la instrucción inmediatamente siguiente a la llamada a la función. 1.


2. Funciones. Efecto de la llamada a una función.  Es necesario señalar que una función NO se ejecuta

hasta que no se produce una llamada a la misma.  De la misma manera, los objetos locales a la función se crean cuando se produce la llamada y se destruyen cuando termina la ejecución de la función.


2. Funciones. Efecto de la llamada a una función.  Ejemplos:


2. Funciones.  Actividad: Con las funciones anteriormente definidas,

haz un programa que lea una letra y si es minúscula, la pase a mayúscula.


2. Funciones.  Solución:


2. Funciones.  Actividad: Diseña una función que se le pase dos

operandos (a y b) y un operador (+, -, *, /, %) y devuelva el resultado de realizar dicha operación.


3. Procedimientos.  Un procedimiento es un método que define un

conjunto de instrucciones explícitamente un valor.

que

NO

devuelven

 Por ejemplo, el conjunto de instrucciones que permite

presentar por pantalla, de forma ordenada, tres valores de tipo entero, pasados como parámetros (sin ningún orden).


3. Procedimientos. Definición y uso.  En la definición de un procedimiento también se distingue

entre la cabecera y el cuerpo del procedimiento.  La cabecera de un procedimiento contiene la siguiente información:  El nombre del procedimiento.

 Entre paréntesis los nombres de los parámetros y los tipos de

los mismos.  (OPCIONAL Y NO RECOMENDANDO) Algunos autores (NO RECOMENDADO) ponen al final del método la instrucción return; para indicar que NO se devuelve nada, pero no se recomienda, si es un procedimiento es mejor que no pongamos ningún return, así indicamos mejor que realmente no devolvemos nada.


3. Procedimientos. Definición y uso.  La sintaxis de la cabecera de un procedimiento en Java

es la de una función que devuelve un valor de tipo vacío, void:

 Los parámetros que se usan en la definición del

procedimiento (param1, param2, etc.) son los parámetros formales, que serán sustituidos por los valores de los parámetros reales en el momento de la llamada.  Ambos parámetros (formales y reales) han de coincidir en número y tipo, según orden de aparición.


3. Procedimientos. Efecto de la llamada a un procedimiento.  Cuando se produce una llamada a un procedimiento se

realizan los siguientes pasos:

Se crean los objetos locales del procedimiento (parámetros formales y variables locales). Los nuevos objetos correspondientes a los parámetros formales toman como valores los de los parámetros reales (paso de parámetros por valor). 2. Se ejecutan las instrucciones del cuerpo del procedimiento. 3. Los objetos locales dejan de existir. 4. La ejecución del programa continúa en la instrucción inmediatamente siguiente a la llamada al procedimiento. 1.


3. Procedimientos.  Ejemplo: Mostrar por pantalla, de forma ordenada, 2 valores de

tipo entero pasados como parámetros sin ningún orden ’a priori’:

 Posibles llamadas al procedimiento:


3. Procedimientos.  NOTA: Algunos programadores cuando acaban un

procedimiento, ponen la siguiente instrucción: return;  Lo hacen para indicar que es un procedimiento y que no se devuelve ningún valor.  NO SE RECOMIENDA.


4. Paso de parámetros por valor.  Estos parámetros (los del método) se consideran

variables locales al método, que se inicializan con los valores que tienen los parámetros reales cuando se produce la llamada al método.

 Por el hecho de ser variables locales al método,

cualquier cambio que se realice dentro del método sobre estas variables locales (parámetros) NO modifica el valor que tiene el parámetro real (desde donde se ha llamado al método) cuando termina la llamada.


4. Paso de parámetros por valor.  En Java todos los parámetros de tipo simple (int.

double, char, boolean) se pasan por valor.

 Cuando tiene lugar un paso de parámetros por valor,

ambos parámetros (formales y reales) son diferentes variables en memoria, la ÚNICA RELACIÓN entre ambos es que, en el momento de la llamada al método, el valor del parámetro real se copia en el parámetro formal, y a partir de ese momento, ya son independientes.  Por el contrario, los parámetros de tipo vector, y en general cualquier objeto, se pasa siempre por referencia.


4. Paso de parámetros por valor.  Ejemplo: public class PasoPorValor{ public static int prueba(int x){ x=x+2; return x; //return x+2 ó return x=x+2; o return x+=2; } public static void main(String args[]){ int x=4; System.out.println(“Valor de x antes de la llamada al método prueba: “+x); System.out.println(“Valor que devuelve la llamada al método prueba: “+prueba(x)); System.out.println(“Valor de x después de la llamada al método prueba: “+x); } }

 ¿Qué salida producirá dicho programa?


4. Paso de parámetros por valor.  Solución: ¿Qué salida producirá dicho programa? Valor de x antes de la llamada al método prueba: 4 Valor que devuelve la llamada al método prueba: 6 Valor de x después de la llamada al método prueba: 4


5. Ámbito de definición de los métodos.  La estructura general de un programa en Java que

define y usa sus propios métodos sería la siguiente:

La declaración de los métodos en Java, da igual que sea antes del main o después de él. Da igual que declares los métodos antes de llamarlos o después de llamarlos. Sea donde sea que declares los métodos y sea donde sea donde llames a dichos métodos (siempre que sea dentro del mismo fichero, ya veremos más adelante cómo llamarlos desde diferentes ficheros) Java los va a ver igual, sin problemas.


5. Ámbito de definición de los métodos.  La declaración de métodos incluye tanto la

descripción de la cabecera como el cuerpo de los mismos.  Esta declaración se puede realizar bien antes o bien después de la declaración del método main. NO hay restricciones en el orden en el que se escriben los métodos.  Es altamente recomendable que los identificadores de los métodos estén relacionados con el significado o papel de los mismos. Es decir, si un método va a calcular la suma de dos números, se recomienda que llame a dicho método suma y no resta o pepe o factorial. Nombres adecuados!


5. Ámbito de definición de los métodos.  Son objetos locales a un método los parámetros

formales y las variables locales que en él se definen. Éstos sólo son accesibles desde el método en el que se han definido. Al finalizar dicho método, estas variables desaparecerán de memoria, no las podremos usar más (excepto si se vuelve a llamar a dicho método, que en este caso se volverán a crear de nuevo en memoria), dejarán de existir.  La comunicación entre la función main y los diferentes métodos se realizará a través de parámetros.  Un método estático definido en una clase se puede utilizar desde cualquier punto de la clase en el que se encuentra dicho método estático.


6. Métodos sobrecargados.  Los métodos pueden estar sobrecargados; esto es,

puede haber varios métodos con el mismo identificador. El número y tipo de parámetros de la función servirá para discriminar el método que ha sido llamado en su momento. Ejemplo: nextInt() y nextInt(int radix) de la clase Scanner.


6. Métodos sobrecargados.  Para que podamos sobrecargar métodos, dichos

métodos deben cumplir una serie de reglas:

Mismo nombre. 2. Diferentes parámetros (orden o tipo). 3. Si un método tiene el mismo nombre, mismos parámetros (orden y tipos) pero devuelve un valor diferente… NO SE CONSIDERA sobrecargado y NO COMPILARÁ, te dirá que ya tienes un método idéntico declarado. Para que se cumpla la regla número 2, SI el orden de los parámetros es diferente, pero los tipos son iguales, se va a considerar el mismo método, y por lo tanto no se considerará sobrecargado. 1.


6. Métodos sobrecargados.  Para que se cumpla la regla número 2 (Diferentes

parámetros (orden o tipos)), SI el orden de los parámetros es diferente, pero los tipos son iguales, se va a considerar el mismo método, y por lo tanto NO se considerará sobrecargado. Ejemplo: public static int suma (int a, int b){ . . . } public static int suma (int b, int a){ . . . El método suma NO está sobrecargado, es el MISMO método, ya que ambos reciben } como parámetros dos int.


6. Métodos sobrecargados.  Ejemplos:


6. Métodos sobrecargados.  Ejemplo 1:


6. Métodos sobrecargados.  Ejemplo 1:  Salida por pantalla:


6. Métodos sobrecargados.  Ejemplo 2:


6. Métodos sobrecargados.  Ejemplo 2:  Salida por pantalla:


6. Métodos sobrecargados.  Ejemplo 3:

 ¿Compilará?


6. Métodos sobrecargados.  Ejemplo 3:  ¿Compilará? NO!


6. Métodos sobrecargados.  Ejemplo 3:  ¿Compilará? NO! 

¿Por qué? Porque hay dos métodos sobrecargados, con el mismo nombre, pero con los mismos parámetros (tanto tipos como número de ellos y orden), solo les diferencia que devuelven un tipo de valor diferente. Pero Java cuando llama a uno de estos dos métodos (ya que coinciden en nombre, tipo de los parámetros y orden de los parámetros) se pregunta… ¿a cuál llamo? ¿al que devuelve un double o al que devuelve un int? Es algo que no puede decidir Java, por lo tanto NO nos permite hacerlo, por lo tanto NO compilará!


6. Métodos sobrecargados. AMPLIACIÓN  Pasar una cadena de texto que contiene un

número a un número entero.

 Para ello se usa el método parseInt(String a) de la clase

Integer. Ejemplo:

String a = "1"; int b = Integer.parseInt(a); //En b tendríamos el valor 1 (int).

 Lo mismo ocurre si queremos pasar a tipo double.

Ejemplo:

String a = "1"; double b = Double.parseDouble(a); //En b tendríamos el valor 1.0 (double).


6. Métodos sobrecargados. AMPLIACIÓN (continuación)  Si la cadena de texto que queremos pasar a int o

double NO contiene un número (por ejemplo contiene letras) nos dará una excepción:

 Ya que NO se puede pasar una cadena de texto que no sean

números a un valor numérico. Para evitar estos mensajes de error tendríamos que capturar la excepción con try y catch como ya hemos visto.


6. Métodos sobrecargados. AMPLIACIÓN (continuación)

 Alguien puede pensar que se podría hacer un casting a

int o double de la siguiente manera: String a = "1"; int b = (int) a;

 NO COMPILARÍA ya que son tipos incompatibles, con

lo cual no se puede realizar la conversión o casting, y nos mostraría el siguiente error de compilación:


6. Métodos sobrecargados.  Actividad 1: Por ejemplo, sobrecarga el método

calcula() de la calculadora, el cual recibía tres parámetros: la opción a realizar (suma, resta, división, producto), y los operandos: a y b. Haz que uno reciba esa opción a realizar como un String y otro como un número entero.


6. Métodos sobrecargados.  Actividad 2: Por ejemplo, sobrecarga los métodos de la

calculadora de sumar, restar, multiplicar y dividir, haciendo que uno sus parámetros sean de tipo entero y otros de tipo String (los números como cadenas de texto). Intenta hacer llamadas a los métodos con los parámetros de tipo int con valores String y viceversa, a ver qué pasa.


6. Métodos sobrecargados.  Actividad 3: Por ejemplo, sobrecarga los métodos de la

calculadora de sumar, restar, multiplicar y dividir, haciendo que uno sus parámetros sean de tipo entero y otros de tipo double. Intenta hacer llamadas a los métodos con los parámetros de tipo int con valores double y viceversa, a ver qué pasa.


6. Métodos sobrecargados.  Solución Actividad: Las llamadas a métodos con

parámetros enteros, si le pasamos parámetros de tipo double, NO funcionarán, ya que no es posible realizar un casting (tipos incompatibles). En cambio las llamadas a métodos con parámetros de tipo double, si le pasamos valores enteros, SÍ que funcionará ya que son tipos compatibles.


Ejercicios  Ejercicio 1: Implementa un método que se llame

bisiesto que diga si un año es bisiesto o no. Incorpóralo al programa de validar fecha.  Ejercicio 2: Ingresar dos números y devolver la suma, mediante el método suma de la clase Calculadora.


Ejercicios  Solución Ejercicio 2: Ingresar dos números y devolver

la suma, mediante el método suma de la clase Calculadora.


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.