Notas
Presentación
Esquema
1
Métodos
  • Introducción a los métodos
2
¿Qué papel juegan los métodos en la programación por objetos?
  • 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
¿Cómo funcionan los métodos?
  • 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
¿Cómo funcionan los métodos? (continuación)
  • 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
¿Cuál es la estructura de un método?
  • 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
¿Cómo se definen los métodos en Java?
  • 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
¿Cuál es la estructura de un método en Java?
  • 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
¿Cómo se invocan los métodos?
  • 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
¿Cómo se invocan los métodos? (continuación)
  • 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
¿Qué es un método estático?
  • 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
¿Qué es un método estático? (continuación)
  • 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
EJEMPLO 1: Definición e invocación de métodos
  • Ir al ejemplo
13
EJERCICIO 1: Definición e invocación de métodos
  • Ir al ejercicio
14
¿Existen clases con métodos comunes para ser reutilizados?
  • 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
¿Cómo puedo reutilizar clases de algún paquete específico?
  • 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
¿Cuáles clases son incluidas automáticamente en java?
  • Ejemplos de clases con métodos estáticos que son incluidas automáticamente en java son:
    • System
    • Math
    • Byte
    • Integer
    • Long
    • Double
    • Character
17
¿Para que sirven las clases Byte, Integer, Double, Float, Character?
  • 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
¿Qué puedo hacer con la clase Math?
  • 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
EJEMPLO 2 – Utilización de métodos de biblioteca

  • Ir al ejemplo
20
EJERCICIO 2 – Utilización de métodos de biblioteca

  • Ir al ejercicio
21
¿Cuáles pasos se llevan a cabo cuando se invoca un método?
22
¿Qué es la Pila de llamados a métodos?
  • 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
¿Qué es la Pila de llamados a métodos? (continuación)
  • 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
¿Qué ocurre cuando unos métodos llaman a otros métodos?
  • 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
¿Cómo funciona la pila de llamados a métodos?
  • 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
¿Qué sucede si las variables dentro de dos métodos se llaman igual?
  • 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
Reglas de alcance de las variables dentro de los métodos
  • 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
EJEMPLO 3 - Demostración de las reglas de alcance de las variables

  • Ir al ejemplo
29
EJERCICIO 3 – Comprensión de las reglas de alcance de las variables
  • Ir al ejercicio
30
Métodos
  • Sobrecarga de métodos
31
¿Qué es sobrecarga de métodos?
  • 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
¿Cómo se distingue a cuál método se está invocando?
  • 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
EJEMPLO 4 – Utilización de la sobrecarga de métodos

  • Ir al ejemplo
34
EJERCICIO 4 – Utilización de la sobrecarga de métodos

  • Ir al ejercicio
35
¿Qué es modularizar?
  • 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
¿Cómo identificar si un método es público o privado?
  • 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
EJEMPLO 5  – Modularización

  • Ir al ejemplo
38
EJERCICIO 5 – Modularización
  • Ir al ejercicio
39
Métodos
  • Encadenamiento de métodos
40
¿Qué es el encadenamiento de métodos?
  • 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
¿Cuál es la ventaja de encadenar métodos?
  • 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
¿Cómo se implementa el encadenamiento de métodos?
  • 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
EJEMPLO 6  – Utilización del encadenamiento de métodos

  • Ir al ejemplo
44
EJERCICIO 6 – Utilización del encadenamiento de métodos
  • Ir al ejercicio
45
Métodos
  • Constructores y destructores
46
¿Qué hace especiales a los constructores y destructores?
  • 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
¿Qué hace especiales a los constructores y destructores? (cont.)
  • 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
¿En que consiste la  “solicitud” y “liberación” de recursos?
  • 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
¿En que consiste la  “solicitud” y “liberación” de recursos? (continuación)
  • 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
¿Cuál es el orden de llamado entre constructores?
  • 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
Ejemplo: Composición Línea de Puntos.
52
EJEMPLO 7  – Utilización de constructores y destructores

  • Ir al ejemplo
53
EJERCICIO 7 – Utilización de constructores y destructores
  • Ir al ejercicio
54
Métodos
  • Recursividad
55
¿Qué es la recursividad?
  • 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
¿Qué es la recursividad? (continuación)
  • 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
¿Qué es un método recursivo?
  • 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
¿Cómo funciona la pila de llamados a métodos cuando hay recursividad?
  • 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
EJEMPLO 8 – Visualización de la recursividad
  • Ir al ejemplo
60
EJERCICIO 8 – Utilización de recursividad
  • Ir al ejercicio
61
EJEMPLO 9 – Utilización de recursividad con varias invocaciones
  • Ir al ejemplo
62
EJEMPLO 10 – Utilización de recursividad para resolución de problemas

  • Ir al ejemplo
63
EJERCICIO 9 – Utilización de la recursividad para la resolución de problemas
  • Ir al ejercicio