Tema 2: Clases y Objetos -...

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

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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Tema 2: Clases y Objetos

Programación Orientada a Objetos

Curso 2018/2019

Page 2: Tema 2: Clases y Objetos - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 Programación Orientada a Objetos 5

Introducción

Programa OO

Clase

Objeto

Colección estructurada

de clases

Implementación de un tipo

de datos.

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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 Programación Orientada a Objetos 6

Clases

Definición: implementación de un tipo de datos.

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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 Programación Orientada a Objetos 76

Diseño de Clases

Los métodos de consulta no deben modificar el valor de

los atributos (estado del objeto).

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=curso2018:tema2.pdf · Métodos y mensajes. ... Diseño de clases. Curso 2018/2019 Programación

Curso 2018/2019 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.