Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Java
Programación orientada a
Programación Avanzada
objetos en Java
1 Clases de objetos 14 Herencia múltiple
2 Protección de miembros 15 Polimorfismo
3 Protección de clases 16 Ligadura dinámica
4 Inicialización y finalización 17 Información de clases en tiempo
5 Creación de objetos de ejecución
6 Trabajando con objetos 18 Otros temas de interés en Java
7 Relaciones entre clases
8 Clases anidadas e interiores
9 Autoreferencias
10 Aplicaciones orientadas a objetos
11 Herencia en Java
12 Adición, redefinición y anulación
13 Protección y herencia
Índice
Programación OO en
Java
Clases de objetos
Programación Avanzada
Objetos
Clases de objetos
Programación OO en
Java
class Cuenta {
long numero;
String titular;
Atributos
float saldo;
float interesAnual;
void ingresoInteresMes () {
saldo += interesAnual * saldo / 1200;
}
Clases de objetos
Programación OO en
Java
class Cuenta {
long numero;
String titular;
float saldo;
float interesAnual;
// Contador de operaciones
static int nOp = 0;
Clases de objetos
Programación OO en
Java
Protección de miembros
Programación Avanzada
-atributoPrivado: Tipo
+atributoPublico: Tipo
#atributoProtegido: Tipo
-operacionPrivada ()
+operacionPublica ()
#operacionProtegida ()
Protección de
miembros
* Las veremos más adelante, al estudiar el mecanismo de la herencia
Programación OO en
Java
Protección de
miembros
Programación 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
Programación Avanzada
class Banco {
Cuenta[] c; // vector de cuentas
... Protección de
}
miembros
Programación OO en
Java
Protección de
miembros
Programación OO en
Java
Protección de clases
Programación Avanzada
Inicialización y finalización
Programación Avanzada
Inicialización y
finalización
Programación OO en
Java
// Constructor general
Cuenta (long aNumero, String aTitular, float aInteresAnual) {
numero = aNumero;
titular = aTitular;
saldo = 0;
interesAnual = aInteresAnual;
}
Inicialización y
finalización
Programación OO en
Java
Inicialización y
Nota: véase el apartado “I/O: Reading and Writing” del tutorial Java de Sun como apoyo para entender
el código del nuevo constructor finalización
Programación OO en
Java
Inicialización y
finalización
Programación OO en
Java
Inicialización y
finalización
Programación OO en
Java
Inicialización y
finalización
Programación OO en
Java
Inicialización y
finalización
Programación OO en
Java
Inicialización y
finalización
Programación OO en
Java
Creación de objetos
Programación Avanzada
in = 0.1f;
num = 18400200;
// Sería equivalente a:
// char[] cc = {'P', 'e', 'd', 'r', 'o'}
// s = new String (cc);
Creación de objetos
* Véase el apartado Characters and Strings del tutorial de Java de Sun para más información
Programación OO en
Java
c1 = c2
// El objeto asociado a la cuenta 18400200 ha quedado desconectado
// y será eliminado por el recolector de basura Creación de objetos
Programación OO en
Java
c2.reintegro (1000);
c1.ingreso (1000);
if (c2.enRojos ())
System.out.println (“Atención: cuenta 18400201 en números rojos”);
Trabajando con
objetos
Programación 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 operación”);
}
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
Programación OO en
Java
Relaciones entre
objetos
* La veremos más adelante, en un apartado específico
Programación OO en
Java
numero: Long
titular: String
-saldo: Float FileOutputStream
interésAnual: Real
ObjectOutputStream
+ingreso (cantidad: Integer)
+reintegro (cantidad: Integer)
+ingresoInteresMes ()
+enRojos (): Boolean
+leerSaldo (): Integer
+salvar () Relaciones entre
objetos
Programación OO en
Java
Relaciones entre
objetos
Programación OO en
Java
public class Cliente {
String nombre, apellidos;
String direccion, localidad;
Date fNacimiento;
Programación 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
Programación OO en
Java
Cliente
Cuenta
titular nombre: String
numero: Long 1 apellidos: String
* dirección: String
titular: String
-saldo: Float localidad: String
interésAnual: Real fNacimiento: Date
Relaciones entre
objetos
Programación 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
Programación OO en
Java
Programación Avanzada
// Constructor general
public Cuenta (long aNumero, Cliente aTitular, float aInteresAnual) {
numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;
movimientos = new LinkedList ();
}
Nota: también sería necesario modificar el otro constructor y la operación salvar para tener en cuenta la lista de movimientos
a la hora de leer/escribir la información de la Cuenta en disco
Relaciones entre
objetos
Programación 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
Programación OO en
Java
Clases anidadas e
interiores
Programación OO en
Java
Autoreferencias
Programación 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 máquina 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 operación main
Exception in thread “main” java.lang.NoSuchMethodError: main
$java BancoApp
Transferencia realizada
$
Nota: Las clases que constituyen una aplicación Java también pueden distribuirse de manera mucho más compacta Aplicaciones
en un único fichero JAR. Consúltese la bibliografía para ver como crean y utilizan estos ficheros orientadas a objetos
Programación OO en
Java
Herencia
Programación Avanzada
A entonces decimos:
A es un ascendiente o superclase de B. Si la herencia entre A y B es directa
decimos además 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 además que B es una clase hija de A
C D
aplicarse herencia:
Especialización. Dado un concepto B y otro concepto A que representa una
especialización de A, entonces puede establecerse una relación 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
Vehículo Empleado Figura
Movimiento
ListaSalvable
registra fecha: Date
CuentaconHistorico tipo: Char
*
recuperar () importe: Real
salvar () saldo: Real
Herencia
Programación OO en
Java
seleccionar ()
mover ()
escalar ()
cambiar color ()
pintar ()
Lista
Pila
Herencia
Programación OO en
Java
Ejemplos de herencia:
Programación Avanzada
Cuenta
numero: Long
titular: String
saldo: Real
interes: Real
ingreso ()
ingresoInteresMes ()
leerSaldo ()
transferirA ()
Herencia
Programación OO en
Java
Figura
x, y: Integer
Rectángulo
Ventana
titulo: String
pintar ()
Editor Boton
pintar () accion ()
Herencia
Programación OO en
Java
Estructuras de datos
Programación Avanzada
Contenedor
nelem: Integer
vaciar ()
copiar (c: Contenedor)
tamaña (): Integer
vacio (): Boolean
Secuencia ContenedorAsociativo
redimensionar (t: Integer) insertar (e: Elemento, pos: Integer) funcionHash (c: Clave): Integer
insertaPrin (e: Elemento)
insertarFinal (e: Elemento)
Herencia
Programación OO en
Java
Herencia en Java
Programación Avanzada
periodoSegs: Integer
ultimaej: Date
activa: Boolean
especial
import java.util.*;
Herencia en Java
Programación OO en
Java
Herencia en Java
Programación 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
Programación OO en
Java
Herencia en Java
Programación OO en
Java
Herencia en Java
Programación 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
Programación OO en
Java
Herencia en Java
Programación OO en
Java
periodoSegs: Integer
ultimaej: Date
activa: Boolean
import java.util.Calendar;
import java.util.GregorianCalendar;
public TPReloj () {
super (60);
}
Adición,
redefinición y
anulación
Programación OO en
Java
import java.lang.Runtime;
import java.io.IOException;
Adición,
redefinición y
anulación
Programación OO en
Java
Protección y herencia
Programación Avanzada
import java.util.*;
Protección y
herencia
Programación OO en
Java
Clases abstractas
Programación Avanzada
import java.util.*;
TPAviso
TPReloj
TPEjecucion msg: String
import java.util.Calendar;
import java.util.GregorianCalendar;
Clases abstractas
Programación OO en
Java
if (!activa)
return false;
Clases abstractas
Programación OO en
Java
Clases abstractas
Programación OO en
Java
Herencia múltiple
Programación Avanzada
Poligono
FicheroLectura FicheroEscritura
FicheroLecturaEscritura
Imagen EnlaceURL
ImagenSensible
Herencia múltiple
Programación OO en
Java
atributoX
A B
atributoX atributoX
A B
Herencia múltiple
Programación OO en
Java
contiene almacena
Poligono Segmento
Lista
1 *
FiguraGeometrica
contiene almacena
Poligono
Lista Segmento
1 *
Poligono
Herencia múltiple
Programación OO en
Java
Polimorfismo
Programación Avanzada
Polimorfismo
Programación OO en
Java
tp = tpr;
tp.desactivar ();
tp = tpa;
tp.desactivar ();
tp = tpe;
tp.desactivar ();
}
}
esperarEjecutar (tpr);
esperarEjecutar (tpa);
esperarEjecutar (tpe);
}
}
Polimorfismo
Programación OO en
Java
import java.lang.Exception;
// Sigue...
Polimorfismo
Programación 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
Programación 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
Programación OO en
Java
o = tpr;
System.out.println (o.getClass ().getName ());
}
}
Ligadura dinámica
Programación Avanzada
f () CALL _f
Ligadura dinámica
Programación 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 (); // Versión de TPReloj
tp = tpa;
tp.ejecutarTarea (); // Versión de TPAviso
tp = tpe;
tp.ejecutarTarea (); // Versión de TPEjecucion
}
}
Polimorfismo y
ligadura dinámica
Programación OO en
Java
ejecución
Tras realizar una conexión polimorfa es frecuente la
necesidad de volver a recuperar el objeto original, para
acceder a sus operaciones propias
Se trata de la operación inversa al polimorfismo
(upcasting), denominada downcasting
Si el polimorfismo implica una generalización, el
downcasting implica una especialización
Al contrario que el upcasting, el downcasting no puede
realizarse directamente mediante una conexión con
una referencia de la clase del objeto Información de
clases en tiempo de
ejecución
Programación OO en
Java
Información de
clases en tiempo de
ejecución
Programación 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”);
}
}
}
Información de
clases en tiempo de
ejecución
Programación OO en
Java
import java.lang.*;
Class c = TareaPeriodica.class;
if (c.isInterface ())
System.out.println (“TareaPeriodica es una Interfaz”);
}
Información de
clases en tiempo de
ejecución
Programación 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
interés en Java
Programación OO en
Java
numero = aNumero;
titular = aTitular;
saldo = 0;
interesAnual = aInteresAnual;
Otros temas de
interés en Java
Programación OO en
Java
Otros temas de
interés en Java
Programación OO en
Java
terminar = false;
nTareas = 0;
maxTareas = aMaxTareas;
tareas = new TareaPeriodica[maxTareas];
}
// Sigue...
Otros temas de
interés en Java
Programación OO en
Java
while (!terminar) {
for (int t = 0; t < nTareas; t++)
if (tareas[t].necesitaEjecucion ())
tareas[t].ejecutarTarea ();
Otros temas de
interés en Java
Programación OO en
Java
Esta aplicación contaría con dos hilos de ejecución en paralelo, uno principal y otro
Programación 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
interés en Java