1
|
- Introducción a los métodos
|
2
|
- El rol principal de los métodos es el de “modularizar”.
- A las acciones que se llevan a cabo sobre los objetos se les puede
asignar nombre para invocarlas posteriormente.
- Un método puede ser invocado cuantas veces sea necesario.
- Al igual que los atributos los métodos pueden ser miembros de una clase.
- Cada método consiste en un grupo de instrucciones que llevan a cabo una
tarea o acción específica.
|
3
|
- Una vez creado un método, mediante el nombre se pueden invocar las
instrucciones asociadas a él.
- Incluso se pueden pasar valores en el momento del llamado al bloque de
instrucciones para ser utilizadas en el proceso. Estos valores se pasan utilizando
“parámetros”.
- Los parámetros son variables definidas como parte del encabezado del
método y su utilidad es la de recibir valores externos y almacenarlos
temporalmente mientras el método se ejecuta.
- Al terminar su trabajo un método puede devolver un valor resultante al
punto desde donde se invocó su nombre.
|
4
|
- En Java, por ejemplo, existe un
método llamado:
- double Math.sqrt(double numero)
- que recibe un número y devuelve su raíz cuadrada al programa que lo
invoque.
|
5
|
- El método se compone de un encabezado y un cuerpo.
- El encabezado se compone de:
- El tipo del valor que retorna, que también puede ser vacío (“void”)
- El nombre del método.
- Uno o más parámetros (cada uno
compuesto de su tipo y nombre).
- El cuerpo se compone de:
- El bloque de instrucciones que se van a ejecutar cuando se invoca el
método.
- Dentro del bloque puede existir una instrucción para retornar el valor
resultante (se coloca solamente cuando el valor de retorno no es
vacío).
|
6
|
- Cuando un método no debe retornar nada, el tipo de valor de retorno es
“void” (vacío).
- Al igual que los atributos de una clase, los métodos pueden ser “public”
o “private”.
- También se puede declarar métodos estáticos con el calificativo
“static”.
- El nombramiento de métodos sigue las mismas convenciones que se siguen
para el nombramiento de variables, aunque en este caso debe describir la
acción o función que lleva a cabo el método.
|
7
|
- class NombreClase{
- public tipoQueRetorna nombreMétodo(tipo parametro1,
- tipo parametro2,
- más parametros…)
- { //Inicia el bloque de instrucciones del método
- // Pueden definirse instrucciones en este bloque
- //valorRetorno es el valor que devuelve el método
- //si el tipoQueRetorna es diferente de void
- return valorRetorno;
- } // Cierra el bloque de instrucciones del método
- } // Cierra la clase
|
8
|
- Un método se invoca utilizando su nombre seguido de paréntesis redondos
( ), asociado a la instancia o clase a la que pertenece. En medio de los paréntesis se
escriben los valores o variables desde donde se obtendrán los valores
que se pasan como parámetros.
- Los valores de los parámetros van separados por comas.
- Luego de que el método finaliza, el programa continua ejecutando la
instrucción que le sigue al punto en que se invocó.
|
9
|
- Si el método devuelve algún valor, dicho valor retornado es evaluado en
el punto donde se encontraba la invocación al método.
- Solamente se puede invocar a un método haciendo uso del nombre de la
clase si el método ha sido creado como método es estático.
|
10
|
- Cuando se define una variable o método como estático, se está creando
una copia “única” que va a ser compartida por “todas” las instancias de
dicha clase.
- Los métodos estáticos van a existir aún y cuando no se hayan creado
objetos a partir de la clase.
- Para invocar a un método estático se utiliza solamente el nombre de la
clase.
- Los métodos estáticos conviven con la clase y no con las instancias de
esa clase.
|
11
|
- Note que por esta razón el método principal o main() tiene que ser
estático. Esto permite contar con
un punto único para iniciar la ejecución de un programa previo a la
existencia de alguna instancia.
- Podemos decir que en la memoria hay elementos estáticos, otros elementos
como las instancias estarán en el montículo principal de memoria o Heap
y los llamados a métodos serán creados en la memoria asignada a la Pila.
|
12
|
|
13
|
|
14
|
- La mayoría de los lenguajes de programación tienen bibliotecas de clases
preconstruidas.
- Las bibliotecas agrupan “paquetes” de clases que llevan a cabo acciones
similares.
- Éstas ayudan a realizar las operaciones más comunes requeridas en los
programas.
- Ejemplos: lectura / escritura de datos, manejo de interfaces gráficas,
operaciones básicas como cálculos matemáticos, comunicaciones en red,
manejo de texto,
|
15
|
- Para poder utilizar un método de alguna clase perteneciente a algún
paquete específico en Java, se debe escribir la instrucción import al
inicio del programa.
- En java el paquete java.lang que contiene la clase System o la clase
Math es importado automáticamente.
- Pero paquetes como swing necesitan de la línea:
- import javax.swing.JOptionPane;
// o bien
- import javax.swing.*; // para importar todos los
- // .class dentro de ese paquete
- El * no incluye los subpaquetes por lo que:
- import javax.swing.*; // no
incluye event.*
- // lo que hace necesario
poner...
- import javax.swing.event.*;
|
16
|
- Ejemplos de clases con métodos estáticos que son incluidas
automáticamente en java son:
- System
- Math
- Byte
- Integer
- Long
- Double
- Character
|
17
|
- Las clases Byte, Boolean, Integer, Double, Float y Character poseen
métodos estáticos comunes para los objetos del tipo indicado por su
nombre.
- Por ejemplo existe un método que reconoce y convierte (“parsing”) una
hilera y la convierte al tipo correspondiente:
- int valor = Integer.parseInt(“25”);
- double valor = Double.parseDouble(“3.1417”);
|
18
|
- La clase Math posee una serie de métodos estáticos para realizar algunas
operaciones matemáticas comunes:
- Math.random() genera un número aleatorio en el rango [0,1[.
- Math.sqrt(x) calcula la raíz cuadrada de “x”.
- Math.pow(x, y) calcula xy.
- Math.sin(x) y Math.cos(x) corresponden a las funciones trigonométricas
seno y coseno.
|
19
|
|
20
|
|
21
|
|
22
|
- La memoria que tiene disponible un programa se divide de acuerdo a su
forma de uso. Se pueden distinguir el montículo principal de memoria o
“Heap” que es donde se colocan los programas y se crean las instancias
de los objetos y la “Pila” que se usa para los llamados a métodos.
- La “Pila” es un fragmento de memoria que sirve para almacenar datos
“temporalmente” mientras un método se encuentra en ejecución.
|
23
|
- Se denomina “Pila” ya que siempre agrega datos al final de los que ya
existen y se eliminan en orden inverso como si se “apilaran” unos sobre
otros.
- Cada llamado a un método registra y crea variables locales al método en
el espacio de memoria correspondiente a la Pila
- Cada vez que un método finaliza, su información es borrada de la “Pila”.
|
24
|
- Los métodos que invocan a otros métodos deben esperar a que los métodos
invocados dentro de su código finalicen su trabajo y “retornen”.
- El control de llamados entre métodos se lleva a cabo mediante una “Pila
de llamados a métodos”.
|
25
|
- Suponga que se tiene:
- int m1 (int n) {
- return n+m2();
- }
- int m2 (){
- return 2;
- }
- Si se invoca a m1 con el parámetro 5 se produce un resultado de 7.
|
26
|
- Las variables locales (declaradas dentro del método) existen solo
mientras se ejecuta el método y solo son visibles dentro del mismo.
- La variables internas no entran en conflicto con otras ya que existen
localmente dentro de la pila para el llamado a ese método específico.
- Los parámetros se comportan como variables locales, solo que se
inicializan con valores externos al método.
- Las variables locales se crean temporalmente en la memoria
correspondiente a la “Pila” mientras el método se ejecuta y son
eliminadas cuando el método termina su ejecución.
|
27
|
- Al referenciar una variable, primero busca el nombre entre las variables
locales (y parámetros) y luego en las variables de instancia.
- Para evitar conflictos de nombres, en Java se usa this.variable para las
de instancia. El this es una referencia al objeto actual.
- Si un método llama a otro, el segundo no puede acceder a las variables
del primero a menos que se pasen como parámetro.
|
28
|
|
29
|
|
30
|
|
31
|
- La sobrecarga de métodos es un mecanismo que permite que dos o más
métodos puedan tener el mismo nombre, siempre y cuando los tipos y / o
números de parámetros sean distintos.
- Esto permite tener varias versiones de una misma operación, que varía
según el número y tipo de los parámetros.
|
32
|
- La unión del nombre del método, el número de parámetros, su tipo y el
orden de los mismos forman una especie de firma única para identificar a
un método.
- Al invocar a un método el compilador reconoce cuál sobrecarga se debe
utilizar gracias al nombre y al número y tipo de los parámetros que el
llamado contiene.
- No se aceptan dos métodos donde lo único que cambia entre un uno y otro
es el valor de retorno. En este
caso las firmas serían iguales y el compilador no sabría a cual versión
del método llamar.
|
33
|
|
34
|
|
35
|
- Se entiende por “modularización” la capacidad para crear bloques de
código que puedan definirse una vez y reutilizarse muchas veces.
- Lo que se pretende es no escribir varias veces dentro del código fuente,
fragmentos que llevan a cabo la misma función. Esto puede darse al tener varios
métodos con bloques comunes de código que llevan a cabo la misma
funcionalidad, o al tener métodos completos que llevan a cabo la misma
funcion.
- Al “factorizar” los bloques en
común hacia métodos parametrizados se cuenta con un mecanismo para
modularizar
- Sin embargo el uso de métodos no asegura la modularización.
|
36
|
- Los métodos públicos se asocian con las acciones que están disponibles
para otros objetos fuera de la clase en la que se definen.
- Los métodos privados deben ser aquellos que sirven para modularizar pero
que no se hacen disponibles fuera de la clase a la que pertenecen.
|
37
|
|
38
|
|
39
|
- Encadenamiento de métodos
|
40
|
- El encadenamiento de métodos es una técnica que permite aplicar llamados
a métodos en secuencia sobre el mismo objeto.
- instancia.metodo1();
- instancia.metodo2();
- Con encadenamiento de métodos esto se puede escribir como:
- instancia.metodo1().metodo2();
|
41
|
- El hecho de poder escribir en una misma secuencia las instrucciones, que
se asocian a un mismo objeto, simplifica la lectura del programa.
- Esto permite escribir instrucciones en una misma línea para cada
instancia.
|
42
|
- Lo necesario para encadenar métodos es que el método que se le aplica al
objeto devuelva luego de llevar a cabo su trabajo, una referencia hacia
el objeto sobre el que acaba de trabajar para que el siguiente método lo
pueda utilizar.
- Clase &metodo() {
- // Modifica o usa la instancia
de Clase
- // Luego devuelve una referencia de la
- // misma instancia que acaba de ser utilizada
- return this;
- }
|
43
|
|
44
|
|
45
|
- Constructores y destructores
|
46
|
- Hay que recordar que el constructor es siempre el primer método que se
ejecuta al crear un objeto, y es invocado de manera automática.
- Además, ya que no son invocados a voluntad, son los únicos métodos a los
que no se les indica ningún tipo de valor de retorno (ni siquiera vacío
o “void”)
- La función del constructor es la se servir de método “inicializador” del
objeto recién creado.
|
47
|
- Este método es el que se encarga de proveer las condiciones necesarias
para que el objeto pueda ser utilizado.
- El constructor debe inicializar con valores apropiados todas las
variables de la instancia recién creada.
- En el constructor se solicitan o crean los recursos que va a necesitar
la instancia.
- El destructor es el encargado de liberar o destruir ordenadamente lo
utilizado.
|
48
|
- Un recurso es todo dispositivo de hardware o software de uso moderado.
- Este caso se refiere a recursos de uso moderado que pueden asignarse a
un programa y posteriormente devolverse. Donde primero se pueden “abrir” para utilizarlos
y luego hay que “cerrar” para que otros los puedan utililizar.
- Es en el constructor donde se debe abrir el recurso y en el destructor
donde se debe cerrar.
|
49
|
- Un caso de la realidad sería el siguiente:
- Al crear un hidrante de bomberos, no tiene sentido si al mismo no le
llega agua, por lo que al construirlo hay que crear un canal entre la
tubería principal hacia el hidrante.
- Si por alguna razón se destruye el hidrante, no se pude dejar el chorro
de agua saliendo por ese lugar por lo que el destructor debe
implementarse para que antes de destruir el hidrante se cierre el canal
existente hacia la tubería principal.
- En computación, recursos importantes que equivalen al “agua” del caso
anterior son: las conexiones o canales de comunicación, las conexiones a
bases de datos y con archivos en el disco, entre otros.
|
50
|
- El orden de ejecución de los constructores es importante ya que para
crear un objeto de alto nivel se necesitan que sus partes hayan sido
creadas apropiadamente y previo a la ejecución del constructor de más
alto nivel.
- Cuando se tienen objetos compuestos el constructor necesita que los
objetos de menor nivel estén construidos para poder utilizarlos.
- Los constructores se ejecutan del nivel más bajo hasta el nivel más
alto.
|
51
|
|
52
|
|
53
|
|
54
|
|
55
|
- La recursividad es una técnica medular para la resolución de problemas
que permite expresar la solución de un problema en términos de si misma.
- Esta técnica permite producir fragmentos de código pequeño de gran poder
en cuanto a funcionalidad.
- La técnica se basa en descomponer un problema dividiéndolo en un caso
base de solución conocida o inmediata, y un subproblema análogo al
problema original pero más simple o cercano a la solución.
|
56
|
- Por ejemplo: El problema de “ir hasta la puerta caminando desde un lugar” se puede expresar
recursivamente como:
- El caso base que es dar un paso hacia la puerta, y si no se llega entonces “ir hasta la
puerta caminando desde el lugar al que se llegó luego de dar el paso”.
- Eventualmente se llegará a la puerta a pesar de que no se sepa cuantos
pasos son necesarios para llegar hasta allá.
|
57
|
- Un método recursivo es aquel que entre sus instrucciones incluye un
llamado a sí mismo y al menos un caso de solución inmediata.
- Los métodos recursivos se deben programar con el mismo cuidado que las
estructuras de control de repetición, ya que en cierta forma son
equivalentes.
- Un método recursivo debe cumplir con lo siguiente:
- Debe tener una o más condiciones que detengan los llamados recursivos.
Se le denomina comúnmente como el “caso base” o la “condición de
parada” para detener la recursividad.
- Debe tener uno o más llamados (en forma directa o indirecta) a si
mismo.
|
58
|
- Suponga que se tiene el método para calcular una sumatoria.
- int f ( int n ) {
- if( n > 0 ) {
- return f(n-1) + n;
- }
- else {
- return n;
- }
- }
|
59
|
|
60
|
|
61
|
|
62
|
|
63
|
|