Tema 2: Clases y Objetos -...

77
Tema 2: Clases y Objetos Programación Orientada a Objetos Curso 2017/2018

Transcript of Tema 2: Clases y Objetos -...

Page 1: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Tema 2: Clases y Objetos

Programación Orientada a Objetos

Curso 2017/2018

Page 2: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 2

Contenido

� Clases.

� Objetos.

� Tipos del lenguaje.

� Relación de clientela.

� Semántica referencia.

� Métodos y mensajes.

� Instancia actual.

� Modelo de ejecución OO.

� Diseño de clases.

Page 3: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 3

Características del paradigma OO

Tema 2

Page 4: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 4

Introducción

Page 5: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 5

Introducción

Programa OO

Clase

Objeto

Colección estructurada

de clases

Implementación de un TAD

Una instancia de una clase

Los objetos se comunican mediante mensajes

Page 6: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 6

Clases

� Definición: implementación de un Tipo Abstracto de Datos (TAD).

� Construcción proporcionada por los lenguajes OO para la definición de objetos que tienen la misma estructura y comportamiento.

� Doble naturaleza: Tipo + Módulo� Tipo: define un nuevo tipo de datos.

� Módulo: organiza el código que implementa el

tipo de datos.

Page 7: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 7

Componentes de una clase

� Atributos:� Definen la estructura de datos que representa a los

objetos.

� Métodos:� Operaciones aplicables sobre los objetos.� Encargados de acceder a los atributos.

� Constructores:� Operaciones encargadas de inicializar correctamente

los objetos.

� Ejemplo: en una aplicación bancaria, los objetos

cuenta tienen en común:� Atributos: saldo, titular, etc.� Métodos: ingreso, reintegro, etc.

Page 8: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 8

Ejemplo – Clase Cuenta

Cuenta

titular: String;

saldo: double;

reintegro (valor:double);

ingreso (valor:double);

Definición de la clase

Atributos

Métodos

“José Martínez”

1200.0

Tiempo de ejecución

Objeto Cuenta

titular

saldo

Page 9: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 9

Clase Cuenta en Java

class Cuenta {

double saldo;

String titular;

void ingreso (double cantidad) {

saldo = saldo + cantidad;

}

void reintegro(double cantidad) {

if (cantidad <= saldo)

saldo = saldo - cantidad;

}

}

Page 10: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 10

Clases en Java

� El código se organiza en torno al concepto de clase (unidad modular).

� Una clase se define en un fichero de código fuente con el mismo nombre de la clase.

� Las clases permiten agrupar una estructura de datos con las rutinas que trabajan sobre ella.

Page 11: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 11

Ocultación de la información

� Ocultación de la información:� A las declaraciones de una clase puede aplicarse un

modificador de visibilidad.

� Pública (public) � visible para todo el código.

� Privada (private) � sólo visible para el código de la clase.

� Principio: la estructura de datos está sujeta a más variaciones que las operaciones� Los atributos se ocultan aplicando visibilidad

privada.

� Los métodos pueden ofrecerse con distintos niveles de visibilidad.

Page 12: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 12

Clase Cuenta

class Cuenta {

private double saldo;

private String titular;

public void ingreso (double cantidad) {

saldo = saldo + cantidad;

}

public void reintegro(double cantidad) {

if (cantidad <= saldo)

saldo = saldo - cantidad;

}

}

Page 13: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 13

Acceso y modificación de atributos

� Los atributos se declaran privados.

� Si un atributo puede ser consultado se define un método de acceso (método get).

� Si un atributo puede ser modificado se define un método de modificación (método set).

� El programador decide el nivel de acceso que proporciona a un atributo (ninguno, get, get/set).

� Aislamos al cliente de los cambios en la estructura de datos.

Page 14: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 14

Clase Cuenta

class Cuenta {

private double saldo;private String titular;

public double getSaldo() {

return saldo;}

public String getTitular() {

return titular;}

}

Page 15: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 15

Paquetes

� Las clases se organizan en paquetes.

� Los paquetes permiten agrupar código relacionado.

� Las declaraciones para las que no se indica visibilidad tienen visibilidad a nivel de paquete(visibilidad por defecto).

� Visibilidad de las clases:

� Públicas: son visibles desde cualquier paquete.

� A nivel de paquete: sólo son visibles en el paquete al que pertenecen.

Page 16: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 16

Paquetes

� El nombre de una clase (tipo) debe ir precedido por el paquete (ruta de paquetes) al que pertenece

� Nombre calificado de la clase.

� La pertenencia de una clase a un paquete debe ser especificada antes de la declaración.

� Anidamiento de paquetes.

� Se utiliza la declaración import para poder omitir la ruta de paquetes al nombrar una clase.

Page 17: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 17

Paquetes

package banco.cuentas;

import java.util.Date;

public class Cuenta {

private double saldo;private String titular;private Date fecha;

public void ingreso (double cantidad) { … }

public void reintegro(double cantidad) { … }}

Page 18: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 18

Objetos

� Un objeto es una instancia de una clase creada en tiempo de ejecución.

� Está representada por una estructura de datos en memoria formada por tantos campos como atributos tiene la clase.

� El estado de un objeto viene dado por el valor de sus campos.

�Los métodos son el único modo de acceder y modificar el estado del objeto.

� El estado de un objeto es inicializado por su constructor

Page 19: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 19

Declaración y construcción

� La declaración de una variable cuyo tipo sea una clase no implica la creación de un objeto.

� Los objetos se construyen explícitamente con el operador new que invoca a un constructor.

// La variable "cuenta" no está inicializadaCuenta cuenta;

// El objeto se crea llamando a un constructorcuenta = new Cuenta();

Page 20: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 20

Constructores en Java

� Un constructor se encarga de la correcta inicialización de los objetos antes de su uso.

� Método con el mismo nombre de la clase pero sin valor de retorno.

� Todas las clases deben tener al menos un constructor.

� Si el programador no declara ningún constructor, el compilador incluye un constructor por defecto (constructor vacío sin parámetros).

Page 21: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 21

Constructores en Java

� La construcción de un objeto consta de tres etapas:

� Se reserva en memoria espacio para la estructura de datos que define la clase.

� Se realiza la inicialización de los campos con los valores por defecto asociados a su tipo de datos.

� Se realiza la llamada al constructor que finaliza la inicialización.

Page 22: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 22

Inicialización de los campos

� Inicialización de los campos por defecto:

� Tipos numéricos: se inicializan a 0.

� Carácter: al carácter 0 (‘\u000’)

� Booleano: false.

� Objetos: valor nulo (null).

� Podemos establecer el valor de inicialización en la declaración de un atributo.

Page 23: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 23

Clase Cuenta

public class Cuenta {

private double saldo = 100;private String titular;

public Cuenta(String nombre) {

titular = nombre;}

public void ingreso (double cantidad) { … }

public void reintegro(double cantidad) { … }

}

Page 24: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 24

Atributos finales

� Java permite especificar que el valor de un atributo no podrá variar una vez construido el objeto.

� Un atributo se declara de sólo consultaanteponiendo el modificador final a su declaración.

� Los atributos finales deben ser inicializados en la declaración o en un constructor.

Page 25: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 25

Clase Cuenta

public class Cuenta {

private double saldo = 100;

private final String titular;

public Cuenta(String nombre) {

titular = nombre;}…

}

Page 26: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 26

Reutilización constructores

� Una clase puede tener más de un constructor.

� Habitualmente los constructores utilizan otros constructores de la misma clase (reutilización).

� Un constructor puede invocar a otro utilizando this(parámetros)

Page 27: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 27

Clase Cuenta

public class Cuenta {

…public Cuenta(String persona, double saldoInicial) {

saldo = saldoInicial;titular = persona;

}

public Cuenta(String persona) {

this(persona, 100.0);}…

}

Page 28: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 28

Destrucción de objetos

� En Java no se destruyen los objetos

explícitamente (no hay operador delete).

� Existe un mecanismo que elimina los objetos que

no están en uso (que no son referenciados)

� Garbage collector

Page 29: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 29

Tipos del lenguaje

� El lenguaje Java define dos categorías de tipos de datos:� Tipos primitivos.

� Objetos (definidos por clases).

� Los tipos primitivos corresponden a los tipos de datos básicos:� Enteros: byte, short, int, long

� Reales: float, double� Carácter: char

� Booleano: boolean

� String es una clase, no un tipo primitivo.

Page 30: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 30

Tipos del lenguaje - Enumerados

� Los enumerados son tipos y sus valores son objetos que se definen con la construcción enum:

public class Cuenta {…private EstadoCuenta estado;

public Cuenta(Persona persona) {

estado = EstadoCuenta.OPERATIVA;…

}

public enum EstadoCuenta {

OPERATIVA, INMOVILIZADA, NUMEROS_ROJOS;

}

Page 31: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 31

Tipos del lenguaje – Arrays

� Los arrays son objetos.

� Tal como sucede con las clases, los arrays no se construyen en su declaración.

�Es necesario construirlos utilizando el operador new.

public class Cuenta {

private double saldo = 100;private final String titular;private double[] ultimasOperaciones;

public Cuenta(String nombre) {

titular = nombre;ultimasOperaciones = new double[20];

}…

Page 32: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 32

Tipos del lenguaje – Arrays

� Cada elemento del array se inicializa con el valor por defecto asociado a su tipo de datos:

� Objetos a null, enteros a 0, etc.

� Por tanto, si el tipo del array es una clase, las casillas del array no almacenan ningún objeto.

� Los arrays se indexan a partir del índice 0.

� Se pueden construir arrays de varias dimensiones:

Cuenta[][] cuentas = new Cuenta[2][3];cuentas[0][0] = new Cuenta(“Juan”);cuentas[0][1] = new Cuenta(“Pedro”);…

Page 33: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 33

Relación de clientela

� Cuando una clase A declara un atributo cuyo tipo es otra clase B, decimos que la clase A es cliente de B.

� Ejemplo:

� Definimos la clase Persona con las propiedades nombre y dni.

� Declaramos el atributo titular de tipo Persona.

Page 34: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 34

Relación de clientela

public class Cuenta {

…private final Persona titular;private double[] ultimasOperaciones;

public Cuenta(Persona persona) {

titular = persona;ultimasOperaciones = new double[20];

}

public Persona getTitular() {

return titular;} …

}

Page 35: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 35

Semántica referencia

� Los objetos tienen un identificador que diferencia

unos de otros (identificador de objeto, oid)

� En la asignación de un objeto a una variable, no se

asigna la estructura de datos del objeto, sino el

identificador del objeto.

���� En Java los objetos se manejan por referencia.

� Una referencia puede tener dos estados:

� No inicializada: no referencia a ningún objeto.

� Conectada: contiene la referencia (oid) a un objeto.

Page 36: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 36

Semántica referencia

� Cuando se declara una variable la referencia no estáinicializada.

� Al crear el objeto se le asigna un identificador, que es almacenado en la variable

// La variable "cuenta" no está inicializadaCuenta cuenta;

// La variable contiene la referencia al nuevo objetocuenta = new Cuenta();

Page 37: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 37

Semántica referencia

variable

Page 38: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 38

Semántica referencia

� El manejo de los objetos por referencia tiene ventajas:� Compartición de objetos � integridad referencial.

� Estructuras recursivas: objetos que se referencian a sí mismos.

� Resulta más eficiente para el manejo de objetos complejos.

� Los objetos se crean cuando se necesitan y no en su declaración.

� Pero tiene un inconveniente: aliasing.

Page 39: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 39

Semántica Referencia. Compartición.

Page 40: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 40

Semántica Referencia. Estructura recursiva

public class Empleado {

private String nombre;

private Categoria categoria;

private double salario;

private Empleado jefe;

}

Page 41: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 41

Asignación vs. copia

� Asignación de referencias (operador =):� No implica la copia de los objetos, sino los oid.� Se produce aliasing

� ¿Cómo podemos copiar los objetos? Método clone (se estudia en el próximo tema)

a b

a = b

ba

Page 42: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 42

Aliasing - problemas

Cuenta cuenta1;

Cuenta cuenta2;

double saldoCuenta1 = cuenta1.getSaldo();

cuenta2 = cuenta1;

cuenta2.reintegro(1000.0);

// cuenta1.getSaldo() != saldoCuenta1 !!

Page 43: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 43

Aliasing - Ocultación de la información

� Hay que prestar atención a los métodos de acceso, ya que si un atributo es una referencia (objeto), al devolver la referencia se compromete la integridad del objeto.

� Ejemplo: método de consulta de las últimas operaciones

de la cuenta.

� � Quien consulte las últimas operaciones podría modificar el array …

public double[] getUltimasOperaciones()

{

return ultimasOperaciones;

}

Page 44: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 44

Aliasing - Ocultación de la información

� Los arrays son objetos: se manejan por referencia.

� El cliente que recibe la referencia puede modificar el array afectando al objeto cuenta.

� Recomendación: cuando se devuelve la referencia a un objeto en un método público hay que valorar

� Si el objeto no puede ser modificado (objeto inmutable). Por ejemplo, los objetos String no son modificables.

� En caso de ser modificable, devolver una copia del objeto para la consulta.

� Siempre hay que valorar el contexto de la clase.

Page 45: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 45

Identidad vs. igualdad

� Identidad: dos referencias son idénticas si apuntan al mismo objeto (operador ==).

� Identidad entre referencias:� pto1 == pto2; // True

� pto1 == pto3; // False

� ¿Cómo podemos comprobar la igualdad? Método equals (se estudia en el próximo tema)

pto3pto1

pto2

pto4

2

3

2

3

0

0

Page 46: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 46

Métodos y Mensajes

� Un método es una operación asociada a una clase de objetos.

� Está compuesto por:

� Cabecera: identificador y parámetros (signatura).

� Cuerpo: secuencia de instrucciones.

� Mensaje:

� Un mensaje consiste en la aplicación de un método sobre un objeto.

� Mecanismo básico de la computación OO.

� Está formado por el objeto receptor, el identificador del método y los argumentos.

Page 47: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 47

Métodos y Mensajes

� Declaración del método reintegro de la clase Cuenta:

� Aplicación del mensaje reintegro a un objeto cuenta:

public void reintegro(double cantidad) {

if (cantidad <= saldo)

saldo = saldo - cantidad;

}

cuenta.reintegro(6000.0);

Page 48: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 48

Métodos – Estructuras de control

� Sentencias condicionales: if else

� Bucles: while, for

� Bucle “for each”

public double getGastos(){

double total = 0;

for (double operacion : ultimasOperaciones){

if (operacion<0) total+=operacion;

}

return total;

}

� Selecciones múltiples: switch (opcion)

� La opción es un entero, enumerado o una cadena (a partir de la versión 7)

Page 49: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 49

Sobrecarga de métodos

� Posibilidad de definir varios métodos con el mismo

identificador, pero con distinta lista de tipos de

parámetros (se ignora el tipo de retorno).

// Pago de una compra en una vez

public void cobrar(Compra ticket){

reintegro(ticket.getTotal());

}

// Pago a plazos

public boolean cobrar(Compra ticket, boolean aplazado){

}

Page 50: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 50

Paso de parámetros

� El paso de parámetros define el modo en el que se asignan los parámetros reales de una rutina a los parámetros formales (identificadores de los parámetros en la rutina).

public void reintegro(double cantidad) {

}

double v = 3000.0;

cuenta.reintegro(6000.0);

cuenta.reintegro(v);

Parámetro formal

Parámetro real

Page 51: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 51

Paso de parámetros

� En Java se opta por el modo más simple de paso

de parámetros: paso por valor

� Se asigna (operador =) el parámetro real en la variable

que representa al parámetro formal.

� Implica que si se utilizan variables para el paso de

parámetros (variable v en el ejemplo), la variable

no se ve alterada por el método.

Page 52: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 52

Paso de parámetros

� El paso por valor protege a las variables de ser

modificadas, pero no protege el estado de los

objetos.

public void transferencia(Cuenta emisor, Cuenta receptor, double cantidad) {

emisor.reintegro(cantidad);receptor.ingreso(cantidad);emisor = null;

}

Cuenta cuenta1 = new Cuenta(titular1);Cuenta cuenta2 = new Cuenta(titular2);…banco.transferencia(cuenta1, cuenta2, 3000.0);

No afectaría a la variable “cuenta1”

Cambia el estado de los dos objetos

Page 53: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 53

Argumentos de tamaño variable

� Un método o constructor puede definir un argumento de tamaño variable.

� Dentro del método el parámetro se utiliza como un array.

� Sólo puede haber un argumento de este tipo y debe estar al final de la lista de argumentos.

� Ejemplo: método que permite ingresar varias cantidades.

public void ingreso(double... cantidades) {

for (double cantidad : cantidades) {

// …}

}

cuenta.ingreso(30, 40, 20);

cuenta.ingreso(); // permite no establecer el parámetro

Page 54: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 54

Atributos de clase

� ¿Cómo representamos que el valor de una propiedad

sea compartido por todos los objetos de una misma

clase?

� Ejemplo:

� Añadimos a las cuentas un atributo para el código.

� Es necesario una variable que almacene el último

código de cuenta asignado.

� En un lenguaje imperativo se declararía una variable

global.

� Java es un lenguaje OO puro que no permite

declaraciones fuera del ámbito de una clase.

Page 55: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 55

Atributos de clase

� Los atributos de clase son compartidos por todos los objetos de la clase.

� Se definen anteponiendo el modificador static a la declaración del atributo.

public class Cuenta {private static int ultimoCodigo = 0;

private int codigo;private double saldo = 100;private final String titular;

public Cuenta(String nombre) {codigo = ++ultimoCodigo;titular = nombre;

}…

Page 56: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 56

Constantes

� En Java no hay una declaración específica para las constantes.

� Se consigue el mismo resultado definiendo un atributo de clase y final.

� Las constantes no se consideran atributos

� No tiene sentido definir métodos de acceso y modificación.

� El nivel de acceso es controlado por su visibilidad.

� Se deben utilizar las constantes para declarar los valores por defecto en la construcción de los objetos.

Page 57: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 57

Clase Cuenta y valores por defecto

public class Cuenta {

public final static double SALDO_INICIAL = 100.0;…public Cuenta(String persona, double saldoInicial) {

saldo = saldoInicial;titular = persona;

}

public Cuenta(String persona) {

this(persona, SALDO_INICIAL);}…

}

Page 58: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 58

Constantes

public class Cuenta {

private static final int MAX_OPERACIONES = 20;

private static int ultimoCodigo = 0;

private int codigo;private double saldo = 100;private final String titular;private double[] ultimasOperaciones;

public Cuenta(String nombre) {

codigo = ++ultimoCodigo;titular = nombre;ultimasOperaciones = new double[MAX_OPERACIONES];

}…}

Page 59: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 59

Métodos de clase

� ¿Podemos definir operaciones que NO se apliquen

sobre objetos?

� Ejemplo: consultar el número de cuentas creadas.

� Un método se define de clase anteponiendo el

modificador static a su declaración.

� El cuerpo del método sólo puede acceder a los

parámetros y atributos de clase.

� Para la aplicación de un método de clase no se hace

uso de ningún objeto receptor, sino del nombre de la

clase.

Page 60: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 60

Métodos de clase

public class Cuenta {

private static int ultimoCodigo = 0;…public Cuenta(Persona persona) {

codigo = ++ultimoCodigo;…

}

public static int getNumeroCuentas() {

return ultimoCodigo;}

}

Cuenta.getNumeroCuentas();

Page 61: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 61

Importación declaraciones de clase

� Motivación: acceso frecuente a declaraciones static de una clase.

� Ejemplo: funciones matemáticas (clase Math)

� double r = Math.cos(Math.PI * theta);

� La importación estática permite utilizar las

declaraciones sin especificar la clase:import static java.lang.Math.PI;

import static java.lang.Math.*;

double r = cos(PI * theta);

Page 62: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 62

Instancia actual

� ¿A qué objeto Cuenta se refiere el código del método reintegro?

� El cuerpo de un método trabaja sobre la instancia

(objeto) sobre la que se aplica el mensaje

(instancia actual).

public void reintegro(double cantidad) {

if (cantidad <= saldo)

saldo = saldo - cantidad;

}

Page 63: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 63

Instancia actual

123456

600

titular

codigo

saldo

ultimasOperaciones

J. Gomez

87654321

nombre

dni

Objeto Persona

-5000 10000

Objeto Array

c1

public void reintegro (double cantidad) {

if (cantidad <= saldo)

saldo = saldo – cantidad;

}

saldo-300

c1.reintegro(300);

Page 64: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 64

Instancia actual

� Si se aplica un método y no se especifica el objeto receptor se asume que es la instancia actual.

public void cobrar(Compra ticket){

reintegro(ticket.getTotal());

}

Page 65: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 65

Referencia this

� El lenguaje Java proporciona la palabra clave this que referencia a la instancia actual.

� Utilidad:� Distinguir los atributos de los parámetros y variables

locales dentro de la implementación de un método.

� Aplicar un mensaje a otro objeto estableciendo como parámetro la referencia al objeto actual.

public void trasladar(Oficina oficina) {

this.oficina.eliminarCuenta(this);

oficina.añadirCuenta(this);this.oficina = oficina;

}

Page 66: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 66

Modelo de ejecución OO

� Una aplicación OO se organiza como un conjunto de clases relacionadas entre sí(clientela, herencia).

� Una de las clases representa la raíz de la aplicación y contiene un método encargado de poner en marcha la aplicación.

� La ejecución de un programa OO consiste en:

� Creación dinámica de objetos.

� Envío de mensajes entre objetos.

� No hay programa principal, aunque sí un método encargado de arrancar la aplicación.

Page 67: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 67

Modelo de ejecución OO

� En tiempo de ejecución, el flujo de ejecución siempre se encuentra en uno de los siguientes estados:� Aplicando un método sobre algún objeto (instancia

actual)

� Ejecutando alguna instrucción imperativa (asignación, creación, condicional, recorrido, etc.).

� Nota: en una aplicación concurrente puede haber varios flujos de ejecución

Page 68: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 68

Modelo de ejecución OO

obj2obj7

obj3

obj5

obj8

obj9

obj1

obj4ACTUAL

obj1

obj2

Page 69: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 69

Método main de Java

� En Java, la rutina de código encargada de arrancar la aplicación se denomina método main.

� Se define como un método de clase (static) que tiene como parámetro la lista de argumentos del programa.

� La ejecución de una aplicación Java debe comenzar por un método main.

public class Eco {

public static void main(String[] args){

for(String argumento : args)

System.out.println(argumento + " ");

}

}

Page 70: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 70

Características avanzadas

� Un objeto puede ser notificado antes de ser eliminado

por el Garbage Collector implementando el método

finalize().

� Sólo interesa cuando hace uso de recursos que quedan

fuera del proceso que ejecuta la aplicación: conexiones

de bases de datos, etc.

� Los parámetros formales de un método podrían

declararse con el modificador final indicando que no

pueden ser modificados en el cuerpo del método.

� Las variables locales también se pueden declarar

final.

Page 71: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 71

Ampliación enumerados

� Un tipo enumerado declara un tipo de datos de naturaleza objeto.

� Esto significa:

� Una variable del tipo del enumerado puede ser asignada con el valor null.

� A los enumerados podemos aplicarles métodos.

� Ejemplo:

� Método de instancia ordinal(): retorna el índice el índice de la etiqueta del enumerado en la declaración.

// Etiquetas del enumerado: OPERATIVA, INMOVILIZADA, NUMEROS_ROJOS

EstadoCuenta estado = EstadoCuenta.INMOVILIZADA;

int posicion = estado.ordinal(); // 1

Page 72: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 72

Ampliación enumerados

� El método static values() retorna un array con todas

las etiquetas del enumerado.

EstadoCuenta[] etiquetas = EstadoCuenta.values();

EstadoCuenta inmovilizada = etiquetas[1];

// 1, posición de INMOVILIZADA en la declaración

Page 73: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 73

Ampliación Arrays

� Los arrays son objetos. Por tanto, una variable de

tipo array puede ser asignada con el valor null.

� El tamaño de un array puede consultarse a través

del atributo final (no modificable) length.

� Una variable de tipo array se puede inicializar en la

declaración estableciendo sus valores entre llaves.

� La biblioteca de Java ofrece la clase

java.util.Arrays con métodos static que

enriquecen la funcionalidad de los arrays.

Page 74: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 74

Ampliación Arrays

� Ejemplo:

int[] array = {4, 3, 1, 2, 4};

Arrays.sort(array); // ordena el array

for (int i = 0; i < array.length; i++) {

System.out.println(array[i]);

}

Page 75: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 75

Diseño de Clases

� Ocultación de la información:

� Los atributos deben ser privados.

� No todos los atributos necesitan métodos de

acceso/modificación.

� Para la modificación de un atributo no siempre es adecuado

un método set. Por ejemplo, el saldo de una cuenta se

modifica con las operaciones de ingreso y reintegro.

� No todas las propiedades de un objeto deben

representarse como atributos. Algunas propiedades son

calculadas.

� Por ejemplo, antigüedad en el banco a partir de la fecha de apertura.

Page 76: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 76

Diseño de Clases

� Evitar clases con muchos atributos de tipo primitivo:

� Suele ser síntoma de que es necesario definir otra clase que

incluya parte de esos atributos.

� Ejemplo: datos del cliente de una Cuenta definidos en la

clase Persona.

� Patrón de diseño Experto en información:

� Asignar una funcionalidad (método) a la clase que tiene la

información necesaria para llevarla a cabo.

� Los identificadores de clases y métodos deben ser

significativos.

Page 77: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2017:tema2.pdf · Métodos y mensajes. Instancia actual. Modelo de ejecución OO. Diseño

Curso 2017/2018 Programación Orientada a Objetos 77

Seminario 1

� El seminario virtual 1 complementa los contenidos desarrollados en el tema.

� Incluye contenidos que no se desarrollan en teoría:� Documentación del código JavaDoc.

� Convención de nombrado en Java.