Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Java
Programacin orientada a
Programacin Avanzada
objetos en Java
1 Clases de objetos 14 Herencia mltiple
2 Proteccin de miembros 15 Polimorfismo
3 Proteccin de clases 16 Ligadura dinmica
4 Inicializacin y finalizacin 17 Informacin de clases en tiempo
5 Creacin de objetos de ejecucin
6 Trabajando con objetos 18 Otros temas de inters en Java
7 Relaciones entre clases
8 Clases anidadas e interiores
9 Autoreferencias
10 Aplicaciones orientadas a objetos
11 Herencia en Java
12 Adicin, redefinicin y anulacin
13 Proteccin y herencia
ndice
Programacin OO en
Java
Clases de objetos
Programacin Avanzada
Objetos
Clases de objetos
Programacin OO en
Java
class Cuenta {
long numero;
String titular;
Atributos
float saldo;
float interesAnual;
void ingresoInteresMes () {
saldo += interesAnual * saldo / 1200;
}
Clases de objetos
Programacin OO en
Java
class Cuenta {
long numero;
String titular;
float saldo;
float interesAnual;
// Contador de operaciones
static int nOp = 0;
Clases de objetos
Programacin OO en
Java
Proteccin de miembros
Programacin Avanzada
-atributoPrivado: Tipo
+atributoPublico: Tipo
#atributoProtegido: Tipo
-operacionPrivada ()
+operacionPublica ()
#operacionProtegida ()
Proteccin de
miembros
* Las veremos ms adelante, al estudiar el mecanismo de la herencia
Programacin OO en
Java
Proteccin de
miembros
Programacin OO en
Java
En este ejemplo, las clases Cuenta y Banco son amigas al pertenecer al mismo
fichero fuente. El acceso a los atributos de los objetos de la clase Cuenta
Programacin Avanzada
class Banco {
Cuenta[] c; // vector de cuentas
... Proteccin de
}
miembros
Programacin OO en
Java
Proteccin de
miembros
Programacin OO en
Java
Proteccin de clases
Programacin Avanzada
Inicializacin y finalizacin
Programacin Avanzada
Inicializacin y
finalizacin
Programacin OO en
Java
// Constructor general
Cuenta (long aNumero, String aTitular, float aInteresAnual) {
numero = aNumero;
titular = aTitular;
saldo = 0;
interesAnual = aInteresAnual;
}
Inicializacin y
finalizacin
Programacin OO en
Java
Inicializacin y
Nota: vase el apartado I/O: Reading and Writing del tutorial Java de Sun como apoyo para entender
el cdigo del nuevo constructor finalizacin
Programacin OO en
Java
Inicializacin y
finalizacin
Programacin OO en
Java
Inicializacin y
finalizacin
Programacin OO en
Java
Inicializacin y
finalizacin
Programacin OO en
Java
Inicializacin y
finalizacin
Programacin OO en
Java
Inicializacin y
finalizacin
Programacin OO en
Java
Creacin de objetos
Programacin Avanzada
in = 0.1f;
num = 18400200;
// Sera equivalente a:
// char[] cc = {'P', 'e', 'd', 'r', 'o'}
// s = new String (cc);
Creacin de objetos
* Vase el apartado Characters and Strings del tutorial de Java de Sun para ms informacin
Programacin OO en
Java
c1 = c2
// El objeto asociado a la cuenta 18400200 ha quedado desconectado
// y ser eliminado por el recolector de basura Creacin de objetos
Programacin OO en
Java
c2.reintegro (1000);
c1.ingreso (1000);
if (c2.enRojos ())
System.out.println (Atencin: cuenta 18400201 en nmeros rojos);
Trabajando con
objetos
Programacin OO en
Java
try {
stk.nextToken ();
long nc = (long) stk.nval;
stk.nextToken ();
float mi = (float) stk.nval;
}
catch (IOException e) {
System.out.println (Error leyendo datos de operacin);
}
Cuenta c;
try {
c = new Cuenta (nc);
}
catch (Exception e) {
System.out.println (Imposible recuperar cuenta);
return;
}
c.saldo = 1000;
c.saldo = 1000;
^
1 error
c.ingreso (1000);
int pts = Cuenta.eurosAPesetas (c.leerSaldo ());
Trabajando con
objetos
Programacin OO en
Java
Relaciones entre
objetos
* La veremos ms adelante, en un apartado especfico
Programacin OO en
Java
numero: Long
titular: String
-saldo: Float FileOutputStream
intersAnual: Real
ObjectOutputStream
+ingreso (cantidad: Integer)
+reintegro (cantidad: Integer)
+ingresoInteresMes ()
+enRojos (): Boolean
+leerSaldo (): Integer
+salvar () Relaciones entre
objetos
Programacin OO en
Java
Relaciones entre
objetos
Programacin OO en
Java
public class Cliente {
String nombre, apellidos;
String direccion, localidad;
Date fNacimiento;
Programacin Avanzada
// Constructor general
public Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {
numero = aNumero;
titular = aTitular;
saldo = 0;
interesAnual = aInteresAnual;
}
dispone de
Departamento Despacho
1 *
Relaciones entre
objetos
Programacin OO en
Java
Cliente
Cuenta
titular nombre: String
numero: Long 1 apellidos: String
* direccin: String
titular: String
-saldo: Float localidad: String
intersAnual: Real fNacimiento: Date
Relaciones entre
objetos
Programacin OO en
Java
class Movimiento {
Date fecha;
char tipo;
float importe;
float saldo;
public Movimiento (Date aFecha, char aTipo, float aImporte, float aSaldo) {
fecha = aFecha;
tipo = aTipo;
importe = aImporte;
saldo = aSaldo;
}
}
Relaciones entre
objetos
Programacin OO en
Java
Programacin Avanzada
// Constructor general
public Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {
numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;
movimientos = new LinkedList ();
}
Nota: tambin sera necesario modificar el otro constructor y la operacin salvar para tener en cuenta la lista de movimientos
a la hora de leer/escribir la informacin de la Cuenta en disco
Relaciones entre
objetos
Programacin OO en
Java
public Movimiento (Date aFecha, char aTipo, float aImporte, float aSaldo) {
fecha = aFecha; tipo = aTipo; importe = aImporte; saldo = aSaldo;
}
}
// Constructor general
public Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {
numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;
movimientos = new LinkedList ();
}
import java.util.Date
// Constructor general
public Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {
numero = aNumero; titular = aTitular; saldo = 0;
interesAnual = aInteresAnual;
movimientos = new LinkedList ();
}
Clases anidadas e
interiores
Programacin OO en
Java
Clases anidadas e
interiores
Programacin OO en
Java
Autoreferencias
Programacin Avanzada
// Constructor general
public Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {
numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;
movimientos = new LinkedList ();
}
c1.ingreso (1000);
$ls
BancoApp.java Cliente.java Cuenta.java
$javac *.java
La mquina virtual java $ls
producir un error si se BancoApp.class Cliente.class Cuenta.class Movimiento.class
BancoApp.java Cliente.java Cuenta.java
le pasa una clase sin
$java Cuenta
la operacin main
Exception in thread main java.lang.NoSuchMethodError: main
$java BancoApp
Transferencia realizada
$
Nota: Las clases que constituyen una aplicacin Java tambin pueden distribuirse de manera mucho ms compacta Aplicaciones
en un nico fichero JAR. Consltese la bibliografa para ver como crean y utilizan estos ficheros orientadas a objetos
Programacin OO en
Java
Herencia
Programacin Avanzada
A entonces decimos:
A es un ascendiente o superclase de B. Si la herencia entre A y B es directa
decimos adems que A es la clase padre de B
B es un descendiente o subclase de A. Si la herencia entre A y B es directa
decimos adems que B es una clase hija de A
C D
aplicarse herencia:
Especializacin. Dado un concepto B y otro concepto A que representa una
especializacin de A, entonces puede establecerse una relacin de herencia
entre las clases de objetos que representan a A y B. En estas situaciones, el
enunciado A es un B suele ser aplicable
Vehculo Empleado Figura
Movimiento
ListaSalvable
registra fecha: Date
CuentaconHistorico tipo: Char
*
recuperar () importe: Real
salvar () saldo: Real
Herencia
Programacin OO en
Java
seleccionar ()
mover ()
escalar ()
cambiar color ()
pintar ()
Lista
Pila
Herencia
Programacin OO en
Java
Ejemplos de herencia:
Programacin Avanzada
Cuenta
numero: Long
titular: String
saldo: Real
interes: Real
ingreso ()
ingresoInteresMes ()
leerSaldo ()
transferirA ()
Herencia
Programacin OO en
Java
Figura
x, y: Integer
Rectngulo
Ventana
titulo: String
pintar ()
Editor Boton
pintar () accion ()
Herencia
Programacin OO en
Java
Estructuras de datos
Programacin Avanzada
Contenedor
nelem: Integer
vaciar ()
copiar (c: Contenedor)
tamaa (): Integer
vacio (): Boolean
Secuencia ContenedorAsociativo
redimensionar (t: Integer) insertar (e: Elemento, pos: Integer) funcionHash (c: Clave): Integer
insertaPrin (e: Elemento)
insertarFinal (e: Elemento)
Herencia
Programacin OO en
Java
Herencia en Java
Programacin Avanzada
periodoSegs: Integer
ultimaej: Date
activa: Boolean
especial
import java.util.*;
Herencia en Java
Programacin OO en
Java
Herencia en Java
Programacin OO en
Java
import java.util.Calendar;
import java.util.GregorianCalendar;
public TPReloj () {
periodoSegs = 60; // Comprobar cada minuto
actualizarReloj ();
activa = true;
}
import java.lang.Runtime;
import java.io.IOException;
Herencia en Java
Programacin OO en
Java
Herencia en Java
Programacin OO en
Java
Herencia en Java
Programacin OO en
Java
import java.util.Calendar;
import java.util.GregorianCalendar;
public TPReloj () {
super (60);
}
import java.lang.Runtime;
import java.io.IOException;
B
super (...) super (...)
C D
Herencia en Java
Programacin OO en
Java
Herencia en Java
Programacin OO en
Java
periodoSegs: Integer
ultimaej: Date
activa: Boolean
import java.util.Calendar;
import java.util.GregorianCalendar;
public TPReloj () {
super (60);
}
Adicin,
redefinicin y
anulacin
Programacin OO en
Java
import java.lang.Runtime;
import java.io.IOException;
Adicin,
redefinicin y
anulacin
Programacin OO en
Java
Proteccin y herencia
Programacin Avanzada
import java.util.*;
Proteccin y
herencia
Programacin OO en
Java
Clases abstractas
Programacin Avanzada
import java.util.*;
TPAviso
TPReloj
TPEjecucion msg: String
import java.util.Calendar;
import java.util.GregorianCalendar;
Clases abstractas
Programacin OO en
Java
if (!activa)
return false;
Clases abstractas
Programacin OO en
Java
Clases abstractas
Programacin OO en
Java
Herencia mltiple
Programacin Avanzada
Poligono
FicheroLectura FicheroEscritura
FicheroLecturaEscritura
Imagen EnlaceURL
ImagenSensible
Herencia mltiple
Programacin OO en
Java
atributoX
A B
atributoX atributoX
A B
Herencia mltiple
Programacin OO en
Java
contiene almacena
Poligono Segmento
Lista
1 *
FiguraGeometrica
contiene almacena
Poligono
Lista Segmento
1 *
Poligono
Herencia mltiple
Programacin OO en
Java
Polimorfismo
Programacin Avanzada
Polimorfismo
Programacin OO en
Java
tp = tpr;
tp.desactivar ();
tp = tpa;
tp.desactivar ();
tp = tpe;
tp.desactivar ();
}
}
esperarEjecutar (tpr);
esperarEjecutar (tpa);
esperarEjecutar (tpe);
}
}
Polimorfismo
Programacin OO en
Java
import java.lang.Exception;
// Sigue...
Polimorfismo
Programacin OO en
Java
if (nTareas == maxTareas)
throw new DemasiadasTareas ();
tareas[nTareas++] = tp;
}
import java.lang.System;
try {
gt.nuevaTarea (new TPReloj ());
gt.nuevaTarea (new TPAviso (Ha pasado un minuto, 60));
gt.nuevaTarea (new TPEjecucion (/bin/sync, 120));
} catch (DemasiadasTareas e) {
System.out.println (Mmmm.... esto no deberia haber pasado);
}
gt.chequearEjecutar ();
}
}
Polimorfismo
Programacin OO en
Java
tp = tpr;
tp.desactivar (); // Ok
tp.leerHora () // Error !!
tpr.leerHora (); // Ok
}
}
AppGestorTareas.java:XX: cannot resolve symbol
symbol : method leerHora ()
location: class TareaPeriodica
tp.leerHora ();
^
1 error
Polimorfismo
Programacin OO en
Java
o = tpr;
System.out.println (o.getClass ().getName ());
}
}
Ligadura dinmica
Programacin Avanzada
f () CALL _f
Ligadura dinmica
Programacin OO en
Java
f ()
CALL _A_f ?
A r = ??
CALL _B_f ?
B r.f ()
C
f () f ()
CALL _C_f ?
tp = tpr;
tp.ejecutarTarea (); // Versin de TPReloj
tp = tpa;
tp.ejecutarTarea (); // Versin de TPAviso
tp = tpe;
tp.ejecutarTarea (); // Versin de TPEjecucion
}
}
Polimorfismo y
ligadura dinmica
Programacin OO en
Java
ejecucin
Tras realizar una conexin polimorfa es frecuente la
necesidad de volver a recuperar el objeto original, para
acceder a sus operaciones propias
Se trata de la operacin inversa al polimorfismo
(upcasting), denominada downcasting
Si el polimorfismo implica una generalizacin, el
downcasting implica una especializacin
Al contrario que el upcasting, el downcasting no puede
realizarse directamente mediante una conexin con
una referencia de la clase del objeto Informacin de
clases en tiempo de
ejecucin
Programacin OO en
Java
Informacin de
clases en tiempo de
ejecucin
Programacin OO en
Java
try {
tr = (TPReloj) tp;
System.out.println (La hora actual es: + tr.leerHora ());
}
catch (ClassCastException e) {
System.out.println (La referencia tp no apunta a un objeto de la clase TPReloj);
}
}
}
Informacin de
clases en tiempo de
ejecucin
Programacin OO en
Java
import java.lang.*;
Class c = TareaPeriodica.class;
if (c.isInterface ())
System.out.println (TareaPeriodica es una Interfaz);
}
Informacin de
clases en tiempo de
ejecucin
Programacin OO en
Java
LinkedList movimientos;
public Movimiento (Date aFecha, char aTipo, float aImporte, float aSaldo) {
fecha = aFecha;
tipo = aTipo;
importe = aImporte;
saldo = aSaldo;
}
}
} Otros temas de
inters en Java
Programacin OO en
Java
numero = aNumero;
titular = aTitular;
saldo = 0;
interesAnual = aInteresAnual;
Otros temas de
inters en Java
Programacin OO en
Java
Otros temas de
inters en Java
Programacin OO en
Java
terminar = false;
nTareas = 0;
maxTareas = aMaxTareas;
tareas = new TareaPeriodica[maxTareas];
}
// Sigue...
Otros temas de
inters en Java
Programacin OO en
Java
while (!terminar) {
for (int t = 0; t < nTareas; t++)
if (tareas[t].necesitaEjecucion ())
tareas[t].ejecutarTarea ();
Otros temas de
inters en Java
Programacin OO en
Java
Esta aplicacin contara con dos hilos de ejecucin en paralelo, uno principal y otro
Programacin Avanzada
import java.lang.System;
import java.io.IOException;
try {
gt.nuevaTarea (new TPReloj ());
gt.nuevaTarea (new TPAviso ("Ha pasado 1 minuto", 60));
} catch (DemasiadasTareas dt) {}
try {
System.in.read ();
}
catch (IOException e) {}
gt.terminar ();
System.out.println ("Final de hilo de aplicacion");
}
}
Otros temas de
inters en Java