Download objetos

Document related concepts
no text concepts found
Transcript
CURSO
Programación Orientada a Objetos
Parte 1
Fundamentos de
Programación Orientada a Objetos
Ignacio Zahonero Martínez, Luis Joyanes Aguilar
Orientación a Objetos
 La O.O. es el conjunto de disciplinas(ingeniería) que desarrollan y modelizan software para facilitar la
construcción de sistemas complejos a partir de componentes.
 El atractivo de la O.O. es que proporciona conceptos y herramientas con las cuales se modela y representa el
mundo real tan fielmente como sea posible.
 La orientación a objetos promete mejoras de amplio alcance en la forma de diseño, desarrollo y
mantenimiento del software ofreciendo una solución a largo plazo a los problemas y preocupaciones que han
existido desde el comienzo en el desarrollo de software: la falta de portabilidad del código y reusabilidad,
código que es difícil de modificar ... .
 Propiedades más importantes del modelo:
Abstracción (obtiene características esenciales de un objeto).
Encapsulamiento (asegura que la información de un objeto está oculta al mundo exterior).
Modularidad (divide la aplicación en partes, módulos, tan independientes como sea posible).
Jerarquía (ordenación de las abstracciones, dos tipos: generalización/especialización y agregación).
Polimorfismo (mismo operación desencadena acciones diferentes según el objeto(s) que la realiza).
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
2
ABSTRACCIÓN
 Cualidad de los seres humanos que les permite encontrar lo básico que hay de común en una serie de
objetos.
 Es la generalización conceptual de un determinado conjunto de objeto, de sus atributos y
propiedades, dejando en un segundo término los detalles concretos de cada objeto.
 Definir una abstracción significa describir una entidad del mundo real y, a continuación, utilizar esa
descripción en un programa.
Por ejemplo, una reserva es un objeto que tiene un estado (confirmada, lista de espera) y sobre la
que se pueden realizar operaciones (cancelar vuelo, asignar asiento, ...). La reserva es una entidad del
mundo real que se lleva a programación como una clase.
 El elemento clave de la P.O.O es la clase. Una clase es una descripción abstracta de un grupo de
objetos. Por ejemplo, la clase Teatro describe el conjunto de objetos con propiedades y características
comunes (butacas, plantas, capacidad, ...). El teatro Maravillas es un objeto de tipo Teatro que tiene un
estado (tiene 200 butacas, ocupado al 60% ...) y sobre el que se pueden realizar operaciones.
 Las técnicas O.O son el el resultado de una progresión histórica que comienza con los
procedimientos, sigue con los módulos, TAD y objetos.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
3
ENCAPSULAMIENTO
 La encapsulación (ocultación de información) es la propiedad que permite asegurar que la
información de un objeto (datos) está oculta al mundo exterior: el objeto A no conoce lo que hace el
objeto B, y viceversa. Es una de las propiedades característica de la O.O.
 La estructura interna de un objeto permanece oculta, tanto para el usuario como para otros objetos
diferentes.
 El acceso a la información del objeto se hace sólo a través de los métodos adecuados (interfaz).
class Ventana
{
private Color color;
private int alto, ancho;
public void ampliar(int a, int b);
public int getAlto() { return alto; }
public setColor(Color nuevo)
{
color = nuevo;
}
...
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
4
MODULARIDAD
 La modularidad es la propiedad que permite subdividir una aplicación en partes más
pequeñas (módulos), cada una de las cuales debe ser tan independiente como sea posible
de la aplicación en sí y de las restantes partes.
 La modularización, como indica Liskov, consiste en dividir un programa en módulos que
se puedan compilar por separado.
 Los módulos deben ser tan independientes como sea posible. Además, las conexiones
entre módulos deben seguir el criterio de ocultación de información.
 En C++ los módulos son archivos compilados por separado (calendario.h ->
calendario.cpp).
 En Java los módulos son los paquetes (packages).
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
5
Jerarquía
 La jerarquía es una propiedad que permite ordenar las abstracciones.
 Las dos jerarquías más importantes son: generalización/especialización (" es – un") y agregación ("parte de").
 Generalización/ especialización. Relación entre clases, en donde una clase comparte la estructura o
comportamiento definida en otra (otras) clases.
Agregación. Agrupamiento físico de estructuras relacionadas lógicamente. Así, un objeto expresión se
compone de dos operandos y un operador. La expresión es la agregación, operandos y operador
agregados(partes). Otro ejemplo, la cabina turista se compone de 110 asientos, de los cuales 25 son
reclinables, y un aseo ... La cabina es la agregación, asientos y aseo las partes.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
6
Polimorfismo
 Literalmente, posibilidad de que una entidad tome muchas formas.
 Propiedad que indica la posibilidad de referirse a objetos de clases diferentes mediante un mismo
elemento y realizar la misma operación de diferentes formas, según sea el objeto que se referencia
en ese momento.
 El polimorfismo adquiere su máxima expresión en la derivación de clases (herencia).
Por ejemplo, la clase Reserva representa distintos tipos de reservas (puede haber reservas de tren, de avión, de
hotel, ... ). Las operaciones cancelar, pagarTasa, ..., son fundamentales para el proceso. Cada tipo de reserva debe
poder realizar las operaciones anteriores. Por otra parte, la forma de cancelar, o de pagar tasas es distinta para el
transporte aéreo que para el hotel. En términos de POO: se puede enviar cualquier mensaje (cancelar,
calcularTasas,...), las acciones que desencadene serán diferentes según el objeto receptor. Un mismo mensaje se
comporta de forma diferente según la clase sobre la que se aplica.
 El polimorfismo requiere ligadura tardía y esto sólo se puede producir en lenguajes de P.O.O.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
7
CONCEPTOS FUNDAMENTALES DE POO
Definición de POO por Grady Booch
“un método de implementación en el que los programas se organizan como colecciones
cooperativas de objetos, cada uno de los cuales representa una instancia de una clase, y
cuyas clases son todas miembros de una jerarquía de clases unidas mediante relaciones de
herencia".
En esta definición se pueden distinguir tres partes:
1. La POO utiliza objetos, no algoritmos (programación estructurada), como bloques de
construcción lógica.
2. Cada objeto es una instancia de una clase.
3. Las clases se relacionan por medio de relaciones de herencia (realmente se establecen
más tipos de relaciones).
Los conceptos fundamentales de programación: objetos, clases, herencia, mensajes y
métodos.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
8
OBJETOS
 Objeto: entidad que tiene atributos (datos) y formas de comportamientos
(procedimientos).
 Un objeto combina en una sola unidad datos y funciones (métodos) que
operan sobre esos datos.
 Un objeto es una entidad física o lógica que exhibe tres características
principales: estado, comportamiento e identidad.
 Ejemplo de Objeto: cajero automático
Un cajero automático tiene un estado, por ejemplo le quedan billetes de 50 o no, está conectado o no,
etc. Los datos actuales determinan el estado del cajero.
El cajero automático tiene identidad. Dos cajeros físicamente idénticos, en sitios distintos son
diferentes.
Un cajero automático tiene un comportamiento predefinido que le permite interaccionar con el mundo
exterior. Por ejemplo, puede leer una tarjeta de crédito, imprimir el resumen de un cartilla ... . Los
usuarios sólo necesitamos emplear su interfaz, es decir, su comportamiento. Los detalles internos están
ocultos. Nos da igual saber las características técnicas del cajero, si funciona a pilas o a energía solar. El
cajero encapsula su implementación, todo cambio en la misma es transparente para los usuarios.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
9
Ejemplos de objetos
Racional
Punto
- saldo: 400
- numerador: 3
- coordX: 2002
- fecha:21/Sep/06
- denominador: 4
- coordY: 305
- decimal: 0.75
- nombre: Peral
+ sumar(Racional)
+ rotar()
+ mostrar()
+ colorear()
Cajero
+ leerTarjeta()
+ validarNumero(int)
+ comprobarSaldo()
Curso de Programación Orientada a Objetos en Java
+ desplazar()
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
10
CARACTERÍSTICAS DE UN OBJETO

Estado: queda definido por el valor asociado a sus atributos (datos).

Comportamiento: define su forma de interacción con el mundo exterior, esto es, su interfaz.

Identidad: un objeto siempre tendrá asociado un identificador que lo individualiza, de manera que se pueda
distinguir sin ambigüedad entre objetos que se encuentren en el mismo estado y exhiban el mismo
comportamiento.

Dentro del contexto de un lenguaje orientado a objetos, un objeto encapsula datos y los
procedimientos/funciones (métodos) que manejan esos datos.

Ejemplo: Un coche vendido por un comercial, el identificador del objeto es coche1. Los atributos asociados
pueden ser: número_matrícula, fabricante, precio_compra, precio_actual, fecha_compra,
color ...
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
11
OBJETOS(I)

Atributos: Datos o variables que caracterizan el estado de un objeto. El conjunto de atributos apropiado para
un objeto de determina mediante la comprensión del contexto del problema. Los atributos para Alumno que
sirven para la Facultad no sirven para el Departamento de deportes.

Métodos: Procedimientos o acciones que cambian el estado de un objeto.

El objeto retiene cierta información y conoce cómo realizar ciertas operaciones. La encapsulación de
operaciones e información es importante. Los métodos de un objeto sólo pueden manipular directamente los
datos asociados con ese objeto.

Si se desea modificar los datos de un objeto, se conoce exactamente cuáles son las funciones o métodos que
interactúan con el mismo.
Proyector uno = new Proyector(30, "Minerva");
uno.encender();
uno.darColor(red);
Curso de Programación Orientada a Objetos en Java
// proyector de 30 kw
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
12
OBJETOS(II)

Las funciones o métodos que interactúan con el objeto constituyen su interfaz.

¿ Qué clase de cosas pueden ser objetos ?: la respuesta está solo limitada a nuestra imaginación.
Todo dependerá del dominio del problema.
•
•
•
•
•
Objetos físicos: climatizador, termómetro, coche... .
Animales: vertebrados, pescado_blanco ....
Elementos de interfaz gráficos: ventana, menú, ... .
Tipos de datos definidos por el usuario: punto de un sistema de coordenadas, árbol de
caracteres, ...
Interacciones: factura, compra, préstamo ...
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
13
OBJETOS(III)
¿Qué hay en un objeto?:
un objeto no es más que un grupo de datos. pero no es una agrupación pasiva de datos, de las
que simplemente se dejan manipular por los procedimientos, sino que un objeto puede ser un
grupo activo de datos. Un objeto puede ser un número, una palabra, una hoja de cálculo. Si es un
número, puede hacer cosas como multiplicarse por dos, calcular su inverso o multiplicarse por pi.
El usuario utiliza estas funciones transmitiendo un mensaje al objeto que le ordena ejecutar cierta
acción. (Mark Clarkson)
 Los datos del objeto están ocultos, eso asegura que no se puedan modificar accidentalmente
por funciones externas al objeto.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
14
CLASES(I)






Una clase es la descripción de las características de un conjunto de objetos.
Una clase consta de métodos y datos que resumen características comunes del conjunto de objetos.
Las clases son similares a los tipos de datos, equivalen a un tipo de datos objeto.
Una clase no tiene existencia real. Una instancia de una clase si tiene existencia real.
Cada vez que se construye un objeto a partir de una clase se está creando una instancia de esa
clase.
Un objeto se construye a partir de una clase, haciendo una instanciación. En general, instancia de
una clase y objeto son términos intercambiables.
class Socio
{ private String nombre;
Socio melito = new Socio("Juan Bao");
public void darAlta();
class Lampara
{
private int potencia;
private boolean solar;
public void darMasPot(int p)
Lampara c1 = new Lampara();
Lampara c2 = new Lampara();
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
15
CLASES(II)






Generalmente, una clase se define como una descripción abstracta de un grupo de objetos, cada uno
de los cuales se diferencia por un estado específico y es capaz de realizar algunas operaciones.
Por ejemplo, la lámpara de mi mesa es un objeto que tiene un estado (encendida o apagada) que
puede realizar operaciones, por ejemplo iluminar, apagar, cambiar bombilla si está rota.
En programación, una clase es una estructura que contiene datos y procedimientos (funciones,
métodos) que son capaces de operar sobre esos datos.
La clase Lámpara tiene una variable que representa la potencia, otra variable para la intensidad, otra
para si puede funcionar con energía solar. La clase tiene métodos (funciones) que operan o utilizan
esas variables.
Dentro de un programa, las clases tienen dos propósitos principales: definir abstracciones y favorecer
la modularidad.
Por ejemplo, la clase Radio encapsula las características y comportamiento de ciertas entidades del
mundo real. El concepto abstracto de "Radio" no tiene existencia física, mientras que mi radio
Thomson es un objeto, una instancia, de la clase Radio sí tiene existencia física y dispone de las
características de toda Radio, por ejemplo sintoniza una emisora, se estropea, se queda sin pilas .... .
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
16
CARACTERÍSTICAS DE UNA CLASE

Abstracción: extrae lo común de un conjunto de objetos

Encapsulamiento de la información: la clase permite asegurar que el contenido de la información de
un objeto está oculta del mundo exterior.

Definición rigurosa de la interfaz con el mundo exterior. El interfaz de una clase captura sólo su vista
externa. Además, la clase tiene una parte de implementación que contiene la representación de la
abstracción, así como los mecanismos que realizan el comportamiento deseado.

Tolerancia a los cambios de implementación.

Flexibilidad y adaptabilidad.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
17
CONSTRUCCIÓN DE CLASES
 C++ es un lenguaje de programación que permite tanto la programación estructurada
como la programación orientada a objetos. Con C++ se implementa fácilmente todos los
conceptos analizados.
 Java es un lenguaje de programación orientado a objetos que elimina las cuestiones mas
complicadas de C++, como por ejemplo los punteros. En Java todo se construye a base de
clases y objetos.
 La creación de un programa O.O requiere la construcción de una colección de clases. Para
ello será necesario declarar y usar las clases.
 La declaración implica una descripción de las funciones miembro (métodos) y datos
miembro de la clase.
 Un programa controlador será el encargado de utilizar las clases
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
18
DECLARACIÓN DE CLASES
 La declaración (en Java) tiene el formato siguiente:
class Nombre
{
private ...
protected ...
public ...
//cuerpo de la clase
}
class NumerosRojos
{
private String numCuenta ="2345-g";
private Titular t;
private float saldo = 0.0;
public void enviarAviso() {
System.out.print("
");}
}
El cuerpo contiene las declaraciones de los miembros:
Miembros dato, se declaran como variables.
Miembros método, se declaran y definen (implementan) en el cuerpo de la clase . En C++
normalmente, su implementación se sitúa en el exterior.
 La clase encapsula sus miembros dato y función o método. Ha de tener un mecanismo para
controlar el acceso a la misma
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
19
ENCAPSULAMIENTO EN LAS CLASES(I)

Un principio fundamental en programación orientada a objetos es la ocultación de la información, que significa
que determinados datos del interior de un objeto no se puede acceder por métodos externos a la clase.

El mecanismo fundamental para ocultar datos es ponerlos en una clase y hacerlos privados. A estos datos o
métodos privados sólo se accede desde dentro de la clase.

Los datos y métodos públicos son accesibles desde el exterior de la clase.
privado
datos o métodos
público
accesibles desde el exterior
Curso de Programación Orientada a Objetos en Java
métodos
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
20
ENCAPSULAMIENTO EN LAS CLASES(II)

La visibilidad de cada miembro de la clase depende del especificador de acceso que le afecta: private,
protrected y public.
class Autor
class Nombre_Clase
{
private miembro privado
protected miembro protegido
public miembro publico
{
private String nom = "Sin nombre";
private int codigo;
private Vector<Obra> v = new Vector<Obra>();
public void setNombre(String n) ...
}
}

Miembros privados: sólo accesibles por métodos miembro de la clase. Etiqueta private.

Miembros públicos: accesibles desde cualquier parte del programa. Forman el interfaz a través del cual se utiliza

Miembros protegidos: accesibles por los métodos miembro de la clase y de las clases derivadas. Etiqueta

Por defecto, en Java, son accesibles desde la propia clase y por las clases del mismo package.
el objeto. Etiqueta public.
protected.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
21
ENCAPSULAMIENTO EN LAS CLASES(III)

El uso del interfaz público ha de estar limitado a los métodos miembro requeridos para manipular y proveer
información sobre las instancias creadas de la clase.

Los métodos miembro de apoyo a los otros métodos de la clase deben estar ocultos.

Los datos estarán ocultos al exterior de la clase. En general se incluyen en la sección privada o protegida.

La cláusula protected reduce el nivel de ocultación, permitiendo que las clases derivadas accedan a los
miembros protegidos de la clase base.

Utilizar métodos miembro para establecer y consultar los valores de los datos (métodos set y get).

Para permitir el acceso a las clases descendientes, situar los datos en la sección protegida (protected).
class Planta
Planta una = new Planta(20,14);
{
protected int a, b;
public int getAncho() {
return a;
una.b = 12;
// error
una.setBase(12); // correcto
}
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
22
EJEMPLOS DE DECLARACIÓN DE CLASES
class Ventana
class Rectangulo
{
{
public void inicio(){...}
protected double base;
public void mover(int, int) {...}
protected double altura;
public char get() {...}
public void
dimension(double a, double h)
public char get(int x, int y) {...}
{
private void checkeoRango
base = a; altura = h;
(int a, int b) {...}
protected short alto, ancho;
}
protected Punto posicion;
public double area()
protected Punto inicioPantalla;
{
return base * altura;
}
}
}
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
23
DATOS MIEMBRO DE LA CLASE

La declaración de los datos miembro (atributos) de una clase es de la misma forma que la declaración de
variables.

En Java está permitida la inicialización explícita de las variables que representan a los datos.

El constructor de la clase tiene como misión inicializar los datos miembro.

Un dato puede ser un objeto de otra clase (objetos compuestos).
class Persona
class Fecha { ...
};
class Dni { ... };
{
protected String nombre;
protected Fecha diaNac;
protected Dni idt;
protected char genero ='I';
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
24
MÉTODOS DE UNA CLASE
 Son las funciones declaradas y definidas dentro del cuerpo de la clase.
 Conceptualmente, los métodos de una clase son el conjunto de operaciones que pueden
"manipular" objetos de la clase en las que han sido declaradas.
 Los métodos de una clase pueden acceder directamente a cualquier miembro dato o a otro
método, público o no público, de su clase.
 Un método sólo se puede sobrecargar a otro método miembro de su propia clase.
 Los métodos utilizados para manipulación interna de datos deben ser privados o protegidos.
 Los métodos que describen el comportamiento, los definidos para entrada, o, en general, de
proceso serán públicos.
class Racional {
public Racional suma (Racional r2) {...}
public Racional suma (int n) {...}
private void simplifica()
// método interno
 La sintaxis estándar para la llamada a un método de una clase (enviar un mensaje):
nombre_objeto.nombre_método(parámetros)
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
25
MÉTODOS Y MENSAJES
 Un programa orientado a objetos consiste en un número de objetos que se comunican
unos con otros a través del envío de mensajes.
Los mensajes relacionan unos objetos con
otros y con el mundo exterior.
En POO la acción se inicia por la transmisión de un
mensaje a un objeto. En respuesta al mensaje, el
receptor ejecutará algún método.
 Los métodos son como los procedimientos. Un método puede definirse como un
programa procedimental que está asociado a un objeto y cuya ejecución sólo puede
desencadenarse a través de un mensaje recibido por éste o por sus descendientes.
 En C++, método es una función miembro de una clase. En Java recibe el mismo
nombre, es decir, método.
 Un mensaje es la petición a un objeto de que ejecute uno de sus métodos. Los
componentes de un mensaje son el nombre del receptor, el método invocado y la
información necesaria para ejecutar el método.
 Un mensaje equivale a una llamada a un método o función miembro .
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
26
TIPOS DE OPERACIONES (MÉTODOS)

Operaciones gerente: se encargan de la inicialización/destrucción y asignación de objetos. Son los métodos
miembro constructor/ destructor.

Operaciones de desarrollo. Representan el interfaz principal de la clase. Proporcionan los requisitos funcionales.
Por ejemplo, en la clase Cuenta retirar(); en la clase Ventana minimizar(), darColor(), ... .

Operaciones de acceso. La ocultación de información encapsula la representación interna de los objetos de la
clase, protegiendo los datos de modificaciones aleatorias. Con las operaciones de acceso se permite obtener
información de ciertos atributos (son lo métodos get(); por ejemplo, String getApellido()).
La operación int altoV() de la clase Ventana, que devuelve el atributo alto, es una operación de acceso.

Modificadores, permiten a un programa cliente cambiar los contenidos de los miembros dato. Por ejemplo, de la
clase Racional, void setNumerador(int n).

Iteradores, procesan collecciones de objetos, tales como listas, colas.

Operaciones de ayuda. Realizan tareas auxiliares necesarias para otras operaciones. El acceso está restringido a la
clase, son funciones privadas.

Operaciones de cálculo. Realizan operaciones matemáticas.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
27
REPRESENTACIÓN DE UNA CLASE
 Las notaciones para representar una clase y sus instancias varía según la
metodología. En UML (unified modeling language), una clase se dibuja con un
rectángulo dividido en tres bandas.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
28
EJEMPLO DE DECLARACIÓN DE UNA CLASE
class Cuenta
{
protected double saldo;
public Cuenta()
{
saldo = 100.0;
}
public double saldoActual()
{
return saldo;
}
public void
depositar(double cantidad)
{
public
double retirar (double cuanto)
{
if (cuanto <= saldo)
{
saldo -= cuanto;
return cuanto;
}
else
return 0.0;
}
saldo += cantidad;
}
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
29
INSTANCIAS DE UNA CLASE: OBJETOS

Después de definir una clase se puede declarar una instancia de esa clase.

Una variable de tipo clase no es un objeto. En Java se dice que es una referencia.
Lampara mp;
Racional r1;
Persona p1;
Ventana [] av = new Ventana[10];

// variable de tipo Lampara
// variable de tipo Racional
// variable de tipo Persona
En Java, las instancias de las clases se definen con el operador new seguido del nombre de la clase y entre
paréntesis la información para inicializar el objeto.
Cuenta c1;
c1 = new Cuenta();
// El objeto Cuenta se referencia con c1
Racional r = new Racional(1,5); // objeto Racional inicializado a 1/5
cl.depositar(200.5);
// objeto cl envía mensaje depositar
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
30
CONSTRUCTORES DE UN OBJETO

Un constructor es el mecanismo que disponen las clase para inicializar los objetos.

El constructor se llama automáticamente cuando se crea una instancia de la clase. Por ejemplo:
Ventana v1 = new Ventana(); // llama al constructor sin argumentos
Complex z1 = new Complex(-1.,1.);

El propósito de un constructor es inicializar los miembros dato (atributos o variables instancia).

El constructor es una método de la clase, tiene el mismo nombre de la clase y no tiene tipo de retorno.
Formato general:
NombleClase(lista de argumentos)
{
...
}

El constructor puede estar sobrecargado, es decir, mas de un constructor con distintos argumentos.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
31
EJEMPLOS DE CONSTRUCTORES(I)
class Circulo
{
private int x, y;
private double radio;
public Circulo(int x0, int y0, double r)
{
radio = r;
x = x0;
y = y0;
}
public Circulo(double r)
{
this(0, 0, r);
}

public Circulo()
{
this(0, 0, 1.0);
}
// instancias de Circulo
Circulo cc1 = new Circulo();
Circulo cc2 = new Circulo(3.0);
Circulo d;
d = new Circulo(-1, 1, 4.5);
Normalmente los constructores son públicos. No tienen tipo de retorno.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
32
EJEMPLOS DE CONSTRUCTORES(II)
class Asignatura
{
private int numCredito = 2;
private int curso = 1;
private String idt = " ";
public Asignatura(int c )
{
curso = c;
}
public Asignatura(int c, String d)
{
curso = c; idt = d;
}
public Asignatura(int c, String d,
int nc)
{
this(c, d);
numCredito = nc;
}

class VectorEntero
{
private int n, cap;
private int[] v;
public VectorEntero() { this(50); }
public VectorEntero(int t)
{
v = new int [cap = t];
n = -1;
}
public VectorEntero(int [] w)
{
cap = 2 * w.length;
v = new int [cap];
for (int i = 0; i < w.length; i++)
v[i] = w[i];
n = w.length;
}
Un constructor por defecto no tiene parámetros. Inicializa los miembros datos a valores por defecto
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
33
CONSTRUCTORES
 Cuando se define un objeto (instanciación), se pasan los valores de los parámetros al constructor
utilizando una sintaxis similar a una llamada a un método.
 Por ejemplo, para crear una instancia del objeto Rectángulo:
Rectangulo r1 = new Rectangulo(15, 20);
// en Java
 El operador new invoca automáticamente al constructor del objeto que se crea.
 A continuación, se crean diferentes objetos Asignatura llamando a los constructores sobrecargados de
la clase:
Asignatura una = new Asignatura(2);
Asignatura dos = new Asignatura(1, "Fundamentos");
Asignatura trs = new Asignatura(3, "ADO", 4);
 Ahora objetos de la colección VectorEntero:
VectorEntero v1 =
VectorEntero v2 =
int [] w = {2, 4,
VectorEntero v3 =
new VectorEntero(); // constructor por defecto
new VectorEntero(20);// capacidad 20 elementos
6, 8};
new VectorEntero(w); // inicializado a w
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
34
OBJETOS COMPUESTOS





Los objetos que contienen otros objetos se conocen como objetos compuestos.
Un ejemplo de un objeto compuesto es la clase Aula. Una aula consta de diversas partes, tales
como una Pizarra, una Tarima y 30(n) Pupitres. Estas partes constituyen los objetos componentes
del objeto Aula.
Cada objetos componente es un atributo del objeto compuesto. A su vez, los objetos
componentes tienen atributos y métodos que los caracterizan.
Los objetos componentes tienen una relación part-of (parte-de) o component-of
(componente-de) con el objetos compuesto, también se representa por has-a (tiene-un). Así, el
Motor es parte de un Avión, la Bodega es parte del Avión,..., ¿el piloto es parte del avión?.
En la mayoría de los sistemas los objetos no contienen en el sentido estricto otros objetos, sino
que contienen referencias a otros objetos. Esta característica ofrece dos ventajas:
1.
2.

Los objetos contenidos pueden cambiar en tamaño y composición, sin afectar al objeto compuesto que los
contiene.
Los objetos contenidos están libres para participar en cualquier número de objetos compuestos, en lugar
de estar bloqueados en un único objeto compuesto.
Los objetos contenidos en objetos compuestos pueden por sí mismo ser objetos compuestos,
dando lugar a una jerarquía de componentes-de.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
35
OBJETOS COMPUESTOS(II)
 Cuando se crea una instancia de un objeto compuesto, todos sus objetos componentes se deben
instanciar al mismo tiempo. Por esa razón, normalmente los argumentos del constructor de objetos
miembros se sitúan en la declaración de la clase que lo contiene. Por ejemplo, suponer la relación
parte-de entre Tiempo y Panel:
class Tiempo
class Panel
{
{
private int h, m, s;
private String titulo;
public Tiempo(int _h, int _m, int _s)
private Tiempo t;
{
public Panel(String nomr)
h = _h; m = _m; s = _s;
{
titulo = nomr; t = new Tiempo();
System.out.println("Hora inicial: " + h +
":" + m + ":" + s);
}
public Panel(String n, int h, int m, int s)
}
public Tiempo(){ this(0,0,0); }
{
titulo = nomr; t = mew Tiemp(h, m, s)
}
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
36
COPIA Y DESTRUCCIÓN DE OBJETOS
 Dos variables de tipo clase se pueden asignar. En Java, esta asignación no supone que se
copien los objetos, simplemente se asignan las referencias.
Complex z1 = new Complex(2,-3);
Complex z2 = new Complex(3,1);
z2 = z1;
// z1 objeto inicializado a 2 – 3i
// z2 inicializado a 3 + i
// el objeto Complex(3,1) ya no es referenciado por z2,
// el objeto Complex(2,-3) se referencia(identifica) por z2 y z1
 Un objeto que no está referenciado es candidato a ser "destruido" por el sistema (garbage
collection).
Color n1 = new Color("red");
Color n2 = new Color (10,30,20);
n1 = n2;
El objeto Color("red") deja de estar referenciado (identificado), puede ser liberado por el sistema.
n1 = null;
// null: palabra reservada; se utiliza para indicar referencia nula.
El objeto Color (10,30,20) deja de estar referenciado (identificado), puede ser liberado por el sistema.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
37
AUTOREFERENCIA: THIS

¿ Cómo reconoce un método de una clase cuál es la instancia que la llama ?. Suponer la clase Pila:
class Pila
{
public void meter(int x)
{
buffer[++cima] = x;
}
Pila p1 = new Pila();
Pila p2 = new Pila();
p1.meter(19);
p2.meter(29);
¿Cómo sabe meter() que buffer o cima es de la pila p1 o p2 ?




this es una palabra reservada especial, que se declara implícitamente para cada clase y tiene la dirección del
objeto que envía el mensaje (invoca al método).
Siempre que se llama a un método se pasa, implícitamente, this . De este modo el método conoce el objeto
(la instancia) que llamó. Los atributos o miembros dato están referenciados, implícitamente, por this .
this se puede utilizar explícitamente para que un método devuelva el el objeto que envía el mensaje: return
this;
Otro uso de this es para llamar desde un constructor a otro de la misma clase.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
38
DIFERENCIA ENTRE CLASE Y OBJETO

Un objeto es un simple elemento, no importa los complejo que pueda ser.

Una clase describe a una familia de elementos similares.

En la práctica, una clase se asemeja a un esquema o plantilla, que se utiliza para crear objetos.

Una clase es un tipo definido que determina la estructura de datos y operaciones asociadas con ese tipo.

A partir de una clase se pueden definir un número ilimitado de objetos. Cada uno de estos objetos tendrá un
estado particular propio ( un objeto ventana puede estar minimizada, otra puede estar dimensionada a mitad de
pantalla, y otras características como su color), aunque compartan algunas operaciones comunes (como ocultar).

Los datos internos de un objeto definen su estado actual.

Un objeto se comunica con otros objetos pasando mensajes.

Un objeto es una instancia de una clase.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
39
UNA APLICACIÓN
 Se declaran y definen dos clases Reloj y Presentar con la finalidad de mostrar el avance del tiempo.
 El comportamiento de Presentar:
•
•
•
Escribir en pantalla el valor asociado.
Incrementar el valor cíclicamente, dentro de un rango.
Establecer el límite superior del rango. El límite inferior será siempre cero.
 El comportamiento de Reloj:
•
•
•

Inicializar el dato (atributo) hora y el dato minuto.
Incrementar en 1 los minutos. Si llega a 60 minutos incrementar las horas.
Mostrar la hora y los minutos actuales.
Una vez definidas las clases Presentar y Reloj es preciso usar las mismas. Se escribe otra clase, se
puede denominar clase principal, con el método main(). Este método controla la creación del objeto
Reloj y simula su funcionamiento con un bucle.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
40
CLASE PRESENTAR
class Presentar
return this;
{
}
private int limite, valor;
public int obtenValor()
public Presentar(int lim)
{
{ valor = 0;
return valor;
limite = lim;
}
}
public int obtenLimite()
public Presentar incr()
{
{
return limite;
valor++;
}
if (valor == limite) valor = 0;
public Presentar mostrar()
return this; //
{
objeto que envía el mensaje
}
if (valor < 10)
public Presentar ponValor(int v)
System.out.print ('0');
{
System.out.print(valor);
if (v < 0) v = -v;
valor = v % limite;//
return this;
rango 0 .. limite-1
}
}
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
41
CLASE RELOJ (I)
class Reloj
public Reloj() // construye objeto hora y minuto
{
{
private Presentar hora;
hora = new Presentar(24);
private Presentar minuto;
minuto = new Presentar(60);
private BufferedReader entrada = new
}
BufferedReader (new
InputStreamReader(System.in));
public Reloj incrementar()
{
private int entradaInt() throws Exception
minuto.incr();
{
if (minuto.obtenValor() == 0)
int q;
hora.incr();
q = Integer.parseInt(entrada.readLine());
return this;
return q;
// aumenta 1 minuto
}
}
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
42
CLASE RELOJ (II)
public Reloj fijar() throws Exception
public Reloj mostrar()
{
{
int inicio;
hora.mostrar();
System.out.println(
System.out.print(" : ");
"Fijar horas, entre 0 y " +
minuto.mostrar();
hora.obtenLimite() + ": ");
System.out.println();
inicio = entradaInt();
return this;
hora.ponValor(inicio);
}
System.out.println(
"Fijar minutos, entre 0 y " +
minuto.obtenLimite() + ": ");
inicio = entradaInt();
minuto.ponValor(inicio);
return this;
}
}
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
43
PROGRAMA QUE MANEJA RELOJ
// bucle de incremento del reloj
public class PruebaReloj
for (int i = 0; i < 60; i++)
{
{
static PrintStream salida = System.out;
t.incrementar();
public static void main(String[] args)
if (i % 6
throws Exception
== 0)
{
{
t.incrementar().mostrar();
Reloj t;
}
t = new Reloj();
}
salida.println("Valor inicial ");
}
t.mostrar();
t.mostrar().fijar(); // concatena mensajes
salida.print( "Tiempo de partida
");
}
t.mostrar();
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
44
Clase Nombre y clase Dirección
Diseñar una clase Nombre que contenga tres miembros dato (nombre, primer
apellido y segundo apellido), un constructor y dos métodos, leerNombre() y
mostrar(). Realizar el diagrama de clases y la implementación en Java.
Escribir la clase Dirección que tome la información del nombre y añada calle,
ciudad, provincia y código postal. Esta clase debe tener los métodos
nuevaDirección(), nuevoNombre() y mostrar().
Clase Nombre
Especificación de atributos:
El conjunto de atributos significativos para la clase Nombre son los que permiten formar el nombre
completo de una persona. Se puede añadir otro dato adicional para el alias (apodo), si es que lo tiene.
Definición de operaciones:
En el supuesto de la clase Nombre, las operaciones que se obtienen son las que permiten modificar los
datos de un objeto de tipo Nombre. Estas son: asignarNom() (set), asignarApp1(),
asignarApp2(), y asignarAlias(). Otras operaciones de la clase son las que permiten
recuperar información, String getNom(), ..., String getNomCompleto() .
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
46
Clase Nombre
Diagrama de la clase:
En el diagrama se va a especificar los nombres de los atributos, el tipo y el nivel de ocultación, que será
privado. Las operaciones tienen visibilidad pública.
Nombre
- nombre : String
- appellido1 : String
- apellido2 : String
- alias : String
+ asignarNom()
+ asignarApel1()
+ asignarApel2()
+ asignarAlias()
+ getNomCompleto()
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
47
Clase Nombre
Implementación utilizando Java
Se codifica la clase Nombre , según está especificado el enunciado, y la clase principal para crear
un objeto de Nombre y realizar operaciones (enviar mensajes ... ).
El archivo fuente con la clase debe tener el nombre de la clase y la extensión .java
Nombre.java
La clase principal define el método main()), en este método se ponen en marcha los objetos, es decir se
crean objetos (operador new) y se envían mensajes. El nombre del archivo, en este ejemplo, es:
PruebaNombre.java
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
48
Nombre.java
public class Nombre
{
private String nombre;
private String apellido1;
private String apellido2;
private String alias;
public Nombre()
{
nombre=apellido1=apellido2=alias= null;
}
public Nombre(String n)
{
this();
nombre = n;
}
public void asignarNom(String nm)
{
nombre = nm;
}
public void asignarApel1(String a1)
{
apellido1 = a1;
}
Curso de Programación Orientada a Objetos en Java
// completar los métodos
public String getNomCompleto()
{
String nmc;
if (nombre == null || apellido1 == null)
nmc = "ERROR, NO ESTA COMPLETO";
else
{
nmc = nombre + apellido1;
if (apellido2 != null)
nmc += apellido2;
}
return nmc;
}
public String toString()
{
return nombre + apellido1 + apellido2 +
"; Alias: " + alias;
}
}
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
49
PruebaNombre.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class PruebaNombre
{
static BufferedReader en = new BufferedReader (new
InputStreamReader (System.in));
public static void main(String[]ar) throws Exception
{
Nombre miNombre;
Nombre tuNombre;
// ahora se crean dos objetos, llamando a cada
// uno de los constructores
miNombre = new Nombre("Ignacio");
miNombre.asignarApel1("Zahonero");
tuNombre = new Nombre();
System.out.println("Dame tu primer
apellido: ");
a = en.readLine();
tuNombre.asignarApel1(a);
// llamada a uno de los métodos
System.out.println("Mi nombre: " +
miNombre.getNomCompleto());
System.out.println("Tu nombre: " +
tuNombre.getNomCompleto());
}
}
System.out.println("Dame tu nombre de pila: ");
String a = en.readLine();
tuNombre.asignarNom(a);
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
50
Clase Dirección
(seguir los mismos pasos, tener en cuenta que un atributo de esta clase es de tipo
Nombre)
Especificación de atributos:
Definición de operaciones:
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
51
EJEMPLO: CLASE PUBLICACION
Una editorial de libros y discos desea crear fichas que almacenen el título y el
precio de cada publicación. Realizar el diagrama de la clase, denominada
Publicación. Implementar la clase en Java con los datos anteriores, un
constructor y los métodos leer(), mostrar().
Especificación de atributos:
Para seleccionar el conjunto de atributos significativos para una clase, se debe contestar a la siguiente pregunta: ¿qué
elementos datos definen esta clase en el contexto del problema?
La lectura del supuesto (diapositiva anterior) nos indica que el precio y el título son los elementos datos que nos
interesa definir. Se pueden añadir otros de interés: fecha de la publicación, editorial, autor y número de
identificación.
Definición de operaciones:
Las operaciones definen el comportamiento de un objeto. Estas se ejecutan al operar sobre los atributos o asociaciones
con otras clases.
El primer paso que sigue el analista para obtener el conjunto de operaciones de una clase, consiste en el simle análisis
gramatical del documento aislando los verbos que aparezcan. Algunos de estos verbos serán operaciones y podrán
conectarse a la clase específica.
En nuestro ejemplo: la operación asignarTitulo() (set) y asignarPrecio() (set) son de importancia para dotar
de información al objeto. La operación mostrar() aparece directamente, su finalidad es escribir en la pantalla la
información guardada por el objeto. Otras operaciones de la clase son las que permiten recuperar información,
String getAutor(), ... .
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
53
Diagrama de la clase:
En el diagrama se va a especificar los nombres de los atributos, el tipo y el nivel de ocultación, que será
privado, o bien protegido debido a que de esta clase se pueden realizar especializaciones, como Revista,
Libro, ... .
Publicación
# titulo : String
# precio : double
-fechaEdi: Date
- editorial : String
- autor : String
- isbn : int
+ asignarPrecio()
+ asignarTitulo()
+ mostrar()
+ leer()
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
54
Implementación utilizando Java
Se codifica la clase Publicación , según está especificado el enunciado, y la clase principal para crear
un objeto de Publicación y realizar operaciones (enviar mensajes ... ).
La clase dispone de un constructor para que al crear el objeto se inicialice el título de la publicación con
la información (parámetro) suministrada. Se puede añadir otro constructor con el fin de inicializar el título
y el precio. También es interesante ampliar los atributos y los métodos de la clase, según el sencillo
análisis realizado en diapositiva 3.
El archivo fuente con la clase debe tener el nombre de la clase y la extensión .java
Publicacion.java
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
55
Publicacion.java
public class Publicacion
{
protected String tit;
protected double precio;
public String toString()
{
return "Titulo: " + tit +
", precio ejemplar: " + precio;
}
public Publicacion(String t)
{
tit = t;
precio = 0.0;
}
public void setPrecio(double r)
{
precio = r;
}
Curso de Programación Orientada a Objetos en Java
public void setTitulo(String t)
{
tit = t;
}
}
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
56
PruebaPublicacion.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class PruebaPublicacion
{
static BufferedReader en = new BufferedReader (new
InputStreamReader (System.in));
public static void main(String[]a) throws Exception
{
Publicacion p;
static double entradaDouble()
throws IOException
{
double r;
String e;
e = en.readLine();
Double q;
System.out.println("Autor de la publicacion: ");
String t = en.readLine();
q = Double.valueOf(e);
r = q.doubleValue();
p = new Publicacion(t);
p.setPrecio(40.0);
// de la entrada
System.out.println("Precio ejemplar: ");
p.setPrecio(entradaDouble());
return r;
}
}
System.out.println("Publicacion: " + p);
}
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
57