Está en la página 1de 9

Tema 2: Programaci n orientada a

objetos en Java
Programaci n orientada a
objetos en Java
1.Clases de objetos
2.Protecci n de miembros
3.Protecci n de clases
4.Inicializaci n y finalizaci n
5.Creaci n de objetos
6.Trabajando con objetos
7.Relaciones entre objetos
8.Clases anidadas e interiores
9.Autoreferencias
10.Aplicaciones orientadas a objetos
11.Herencia
12.Adici n, redefinici n y anulaci n
13.Protecci n y herencia
14.Herencia m ltiple
15.Polimorfismo
16.Ligadura din mica
17.Informaci n de clases en tiempo
de ejecuci n
18.Otros temas de inter s en Java
CIases de objetos
CIases de objetos
Las clases de objetos representan conceptos o
entidades significativos en un problema determinado.
Una clase describe las caracter sticas comunes de un
conjunto de objetos, mediante dos elementos:
Atributos (o variables miembro, variables de clase). Describen el estado interno
de cada objeto
Operaciones (o m todos, funciones miembro). Describen lo que se puede hacer
con el objeto, los servicios que proporciona
Programaci n orientada a
objetos en Java
Atributos
Operaciones
Nombre de Ia cIase Cuenta
n mero: String
titular: String
saldo: Float
interesAnual: Float
ingreso(cantidad: Floatl)
reintegro(cantidad: Floatl)
ingresoInteresMes()
enRojos(): Boolean
leerSaldo(): Real
Durante la ejecuci n de la aplicaci n se producir la
instanciaci n de la clase, es decir, la creaci n de los
objetos que representan cada uno de los individuos
con sus caracter sticas propias, es decir, valores
espec ficos para sus atributos
Cuenta
n mero: String
titular: String
saldo: Float
interesAnual: Float
ingreso(cantidad: Floatl)
reintegro(cantidad: Floatl)
ingresoInteresMes()
enRojos(): Boolean
leerSaldo(): Real
c : Cuenta
numero=123890023
titular="Miguel P rez"
saldo=1800.4
inter sAnual=0.25
d : Cuenta
numero=23900839
titular="Antonio
G mez"
saldo=200
inter sAnual=0.25
e : Cuenta
numero=151590020
titular="Javier
S nchez"
saldo=1200.2
inter sAnual=1.25
CIase de objetos
Objetos
CIases de objetos
Programaci n orientada a
objetos en Java
La implementaci n de esta clase en Java se realizar a en un fichero con nombre
Cuenta.java, y su contenido ser a el siguiente:
c1ass Cuen·a {
1ong numero,
S·ring ·i·u1ar,
f1oa· sa1do,
f1oa· in·eresAnua1,

void ingreso(f1oa· can·idad) { }
void rein·egro(f1oa· can·idad) { }
void ingresoIn·eresMes() { }
boo1ean enRo_os() { }
f1oa· 1eerSa1do() { }
}
Atributos
Operaciones
Los atributos pueden ser de cualquiera de los tipos
b sicos de Java: boolean, char, byte, short, int, long,
float y double, referencias a otros objetos o arrays
de elementos de alguno de los tipos citados
CIases de objetos
Programaci n orientada a
objetos en Java
Al contrario que C++, Java realiza la definici n e
implementaci n de la clase en el mismo lugar, en un
nico fichero .java
CIases de objetos
Programaci n orientada a
objetos en Java
c1ass Cuen·a {
1ong numero,
S·ring ·i·u1ar,
f1oa· sa1do,
f1oa· in·eresAnua1,

void ingreso(f1oa· can·idad) {
sa1do += can·idad,
}
void rein·egro(f1oa· can·idad) {
sa1do -= can·idad,
}
void ingresoIn·eresMes() {
sa1do += in·eresAnua1 * sa1do / 1200,
}
boo1ean enRo_os() { re·urn sa1do < 0, }
f1oa· 1eerSa1do() { re·urn sa1do, }
}
El acceso a los atributos de la clase desde la
implementaci n de las operaciones se realiza de
forma directa
Los atributos u operaciones est ticas (static) no son
afectados por el proceso de instanciaci n de objetos
a partir de la clase
De un atributo est tico no se genera una copia por
cada objeto que se crea. Existe una nica copia
compartida y accesible desde todos los objetos de la
clase
Una operaci n est tica nicamente puede acceder a
miembros est ticos
CIases de objetos
Programaci n orientada a
objetos en Java
CIases de objetos
Programaci n orientada a
objetos en Java
El atributo nOp mantiene una cuenta global del n mero de operaciones
realizadas en las cuentas del banco, para la realizaci n de estad sticas. La
operaci n leerNOperaciones() permite leer este contador
La operaci n eurosAPesetas() es una operaci n auxiliar de la clase Cuenta para
ser usada cuando sea necesaria una conversi n de moneda
c1ass Cuen·a {
1ong numero,
S·ring ·i·u1ar,
f1oa· sa1do,
f1oa· in·eresAnua1,

// Con·ador de operaciones
s·a·ic in· nOp = 0,
s·a·ic in· 1eerNOperaciones() { re·urn nOp, }
// Operaci n es· ·ica auxi1iar de conversi n
s·a·ic 1ong eurosARese·as(f1oa· euros) { re·urn euros * 166.386f, }
void ingreso(f1oa· can·idad) { sa1do += can·idad, ++nOp, }
void rein·egro(f1oa· can·idad) { sa1do -= can·idad, ++nOp, }
}
Protecci n de miembros de Ia cIase
El principio de ocultaci n de informaci n se plasma
en los lenguajes OO en diversos mecanismos de
protecci n de los miembros de la clase
UML permite asociar tres niveles de protecci n
diferentes a cada miembro de la clase:
Miembros p blicos (+). Sin ning n tipo de protecci n especial
Miembros privados (-). Inaccesibles desde el exterior de la clase
Miembros protegidos (#). Similares a los privados aunque se permite su acceso
desde las clases descendientes*
* Las veremos m s adeIante, aI estudiar eI mecanismo de Ia herencia
Clase
-atributoPrivado: Tipo
+atributoPublico: Tipo
#atributoProtegido: Tipo
-operacionPrivada()
+operacionPublica()
#operacionProtegida()
Programaci n orientada a
objetos en Java
Protecci n de
miembros
c1ass Cuen·a {
priva·e 1ong numero,
priva·e S·ring ·i·u1ar,
priva·e f1oa· sa1do,
priva·e f1oa· in·eresAnua1,

pub1ic void ingreso(f1oa· can·idad) {
sa1do += can·idad,
}
pub1ic void rein·egro(f1oa· can·idad) {
sa1do -= can·idad,
}
pub1ic void ingresoIn·eresMes() {
sa1do += in·eresAnua1 * sa1do / 1200,
}
pub1ic boo1ean enRo_os() { re·urn sa1do < 0, }
pub1ic f1oa· 1eerSa1do() { re·urn sa1do, }
}
Programaci n orientada a
objetos en Java
Protecci n de
miembros
En Java un miembro se etiqueta como p blico colo-
cando el identificador public delante de su declaraci n
Para los miembros privados utilizaremos el
identificador private
Cuenta
-numero: Long
-titular: String
-saldo: Float
-inter sAnual: Real
+ingreso(cantidad: Integer)
+reintegro(cantidad: Integer)
+ingresoInteresMes()
+enRojos(): Boolean
+leerSaldo(): Integer
Programaci n orientada a
objetos en Java
Protecci n de
miembros
Los miembros no etiquetados son accesibles por parte
de clases amigas. En C++ y otros lenguajes OO las
clases amigas a una dada pueden indicarse
expl citamente
En Java se consideran amigas todas aquellas que
forman parte del mismo paquete
Un fichero fuente java forma en s un paquete y por tanto todas las clases incluidas
en l son amigas
Las clases incluidas en varios ficheros fuente pueden agruparse en un nico
paquete indicando el nombre de paquete al principio de cada fichero mediante el
indicador package
pac'age prueba,
c1ass A {
...
}
c1ass B {
...
}
pac'age prueba,
c1ass C {
...
}
c1ass Ð {
...
}
c1ass E {
...
}
Las cIases A, B y C son amigas aI pertenecer
aI mismo paquete "prueba¨
Las cIases D y E son amigas aI pertenecer aI
mismo fichero fuente
Programaci n orientada a
objetos en Java
Protecci n de
miembros
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 almacenados
en el vector interno de Banco queda as garantizado. El atributo saldo puede
mantenerse como privado puesto que existe una operaci n que permite obtener su
valor:
c1ass Cuen·a {
1ong numero,
S·ring ·i·u1ar,
priva·e f1oa· sa1do,
f1oa· in·eresAnua1,

pub1ic void ingreso(f1oa· can·idad) {
sa1do += can·idad,
}
pub1ic void rein·egro(f1oa· can·idad) {
sa1do -= can·idad,
}
pub1ic void ingresoIn·eresMes() {
sa1do += in·eresAnua1 * sa1do / 1200,
}
pub1ic boo1ean enRo_os() { re·urn sa1do < 0, }
pub1ic f1oa· 1eerSa1do() { re·urn sa1do, }
}
c1ass Banco {
Cuen·a[| c, // vec·or de cuen·as
...
}
Atenci n: todas las clases que no se declaren como
pertenecientes a ning n paquete de forma expl cita,
pertenecen a un paquete "por defecto" y por tanto son
amigas
Un paquete crea un espacio de nombres propios. Esto
significa que la clase pasa a tener como prefijo el
propio nombre del paquete. A la hora de utilizarla
tenemos tres opciones:
Utilizar su nombre completo: prueba.A
Importar esa clase, para poder utilizarla sin el prefijo. Esto se indica al principio del
c digo fuente mediante import prueba.A
Importar directamente todas las clases del paquete, que se usar an sin prefijo:
import prueba.*
Programaci n orientada a
objetos en Java
Protecci n de
miembros
Un paquete puede estar situado dentro de otro
paquete formando estructuras jer rquicas. Ejemplo:
miapp.prueba.A
Java obliga a que exista una correspondencia entre la
estructura de paquetes de una clase y la estructura de
directorios donde est situada
La raiz de la estructura de directorios debe estar
incluida en el classpath de Java (par metro -cp <dir>)
Las clases miapp.prueba.A, miapp.prueba.B y miapp.C deben estar en la siguiente
estructura de directorios:
Programaci n orientada a
objetos en Java
Protecci n de
miembros
A
B
C
prueba miapp
Por protecci n de clases entendemos un nivel superior
de la ocultaci n de informaci n, a nivel de clases. Es
decir, se trata de especificar que clases pueden ser
utilizadas y cuales no, y por qui n
Dentro de un paquete, las clases son amigas y por
tanto no existen restricciones respecto a la utilizaci n
de una clase por las otras
Sin embargo, desde el punto de vista del exterior,
nicamente podr n ser utilizadas las clases p blicas
del paquete, es decir, aquellas con el identificador
public situado delante de su declaraci n
Programaci n orientada a
objetos en Java
Protecci n de cIases
Protecci n de cIases
Atenci n: Java s lo permite una clase p blica por
fichero fuente, y el nombre de la clase y el fichero
deben coincidir obligatoriamente
Programaci n orientada a
objetos en Java
Protecci n de cIases
En nuestro ejemplo, si queremos que la clase Cuenta pueda ser utilizada desde el
exterior del fichero Cuenta.java deberemos declararla como p blica
pub1ic c1ass Cuen·a {
priva·e 1ong numero,
priva·e S·ring ·i·u1ar,
priva·e f1oa· sa1do,
priva·e f1oa· in·eresAnua1,

pub1ic void ingreso(f1oa· can·idad) {
sa1do += can·idad,
}
pub1ic void rein·egro(f1oa· can·idad) {
sa1do -= can·idad,
}
pub1ic void ingresoIn·eresMes() {
sa1do += in·eresAnua1 * sa1do / 1200,
}
pub1ic boo1ean enRo_os() { re·urn sa1do < 0, }
pub1ic f1oa· 1eerSa1do() { re·urn sa1do, }
}
La iniciaci n de los atributos de la clase se realiza en
Java, al igual que en C++, mediante el uso de
constructores cuyo nombre coincide con el de la clase
Programaci n orientada a
objetos en Java
IniciaIizaci n y
finaIizaci n
IniciaIizaci n y finaIizaci n
pub1ic c1ass Cuen·a {
priva·e 1ong numero,
priva·e S·ring ·i·u1ar,
priva·e f1oa· sa1do,
priva·e f1oa· in·eresAnua1,
Cuen·a(1ong aNumero, S·ring aTi·u1ar, f1oa· aIn·eresAnua1) {
numero = aNumero,
·i·u1ar = aTi·u1ar,
sa1do = 0,
in·eresAnua1 = aIn·eresAnua1,
}
pub1ic void ingreso(f1oa· can·idad) {
sa1do += can·idad,
}
// Res·o de operaciones de 1a c1ase Cuen·a a par·ir de aqu
Java permite la sobrecarga de operaciones, por tanto
se pueden definir varios constructores posible para una
clase siempre que se diferencien en la lista de
argumentos
Programaci n orientada a
objetos en Java
IniciaIizaci n y
finaIizaci n
// Impor·ar ·odas 1as c1ases de1 paque·e _ava.io
impor· _ava.io.*,
pub1ic c1ass Cuen·a {
priva·e 1ong numero,
priva·e S·ring ·i·u1ar,
priva·e f1oa· sa1do,
priva·e f1oa· in·eresAnua1,
// Cons·ruc·or genera1
Cuen·a(1ong aNumero, S·ring aTi·u1ar, f1oa· aIn·eresAnua1) {
numero = aNumero,
·i·u1ar = aTi·u1ar,
sa1do = 0,
in·eresAnua1 = aIn·eresAnua1,
}
Programaci n orientada a
objetos en Java
IniciaIizaci n y
finaIizaci n
// Cons·ruc·or para ob·ener 1os da·os de 1a cuen·a de un fichero
Cuen·a(1ong aNumero) ·hrows Ei1eNo·EoundExcep·ion, IOExcep·ion,
C1assNo·EoundExcep·ion {

Ei1eInpu·S·ream fis = new Ei1eInpu·S·ream(aNumero + ".cn·"),
Ob_ec·Inpu·S·ream ois = new Ob_ec·Inpu·S·ream(fis),
numero = aNumero,
·i·u1ar = (S·ring) ois.readOb_ec·(),
sa1do = ois.readE1oa·(),
in·eresAnua1 = ois.readE1oa·(),
ois.c1ose(),
}
pub1ic void ingreso(f1oa· can·idad) {
sa1do += can·idad,
}
pub1ic void rein·egro(f1oa· can·idad) {
sa1do -= can·idad,
}
pub1ic void ingresoIn·eresMes() {
sa1do += in·eresAnua1 * sa1do / 1200,
}
pub1ic boo1ean enRo_os() { re·urn sa1do < 0, }
pub1ic f1oa· 1eerSa1do() { re·urn sa1do, }
}
Nota: v ase eI apartado "I/O: Reading and Writing¨ deI tutoriaI Java de Sun como apoyo para entender
eI c digo deI nuevo constructor
Programaci n orientada a
objetos en Java
IniciaIizaci n y
finaIizaci n
Si no se proporciona ning n constructor, Java
proporciona autom ticamente un constructor por
defecto, que no recibe argumentos y realiza una
inicializaci n por defecto de los atributos
Una vez implementado un constructor propio por parte
del programador, Java elimina dicho constructor,
aunque puede ser definido nuevamente de manera
expl cita
Cuen·a() {
numero = "00000000",
·i·u1ar = "ninguno",
sa1do = 0,
in·eresAnua1 = 0,
}
Programaci n orientada a
objetos en Java
IniciaIizaci n y
finaIizaci n
Naturalmente los constructores pueden ser marcados
como p blicos, privados, protegidos o con acceso a
nivel de paquete, lo que especificar quien puede crear
objetos de esta clase y de que manera

// Cons·ruc·or genera1
pub1ic Cuen·a(1ong aNumero, S·ring aTi·u1ar, f1oa· aIn·eresAnua1) {
numero = aNumero,
·i·u1ar = aTi·u1ar,
sa1do = 0,
in·eresAnua1 = aIn·eresAnua1,
}
// Cons·ruc·or para ob·ener 1os da·os de 1a cuen·a de un fichero
pub1ic Cuen·a(1ong aNumero) ·hrows Ei1eNo·EoundExcep·ion,
IOExcep·ion, C1assNo·EoundExcep·ion {
Ei1eInpu·S·ream fis = new Ei1eInpu·S·ream(aNumero + ".cn·"),
Ob_ec·Inpu·S·ream ois = new Ob_ec·Inpu·S·ream(fis),
numero = aNumero,
·i·u1ar = (S·ring)ois.readOb_ec·(),
sa1do = ois.readE1oa·(),
in·eresAnua1 = ois.readE1oa·(),
ois.c1ose(),
}
Programaci n orientada a
objetos en Java
IniciaIizaci n y
finaIizaci n
Cuando finaliza el uso de un objeto, es frecuente la
realizaci n de ciertas tareas antes de su destrucci n,
principalmente la liberaci n de la memoria solicitada
durante su ejecuci n. Esto se realiza en C++ y otros
lenguajes OO en los denominados destructores
Estos destructores son operaciones invocadas
autom ticamente justo antes de la destrucci n del
objeto
Sin embargo, en Java la liberaci n de memoria se
realiza de manera autom tica por parte del recolector
de basura, por tanto la necesidad de este tipo de
operaciones no existe en la mayor parte de los casos
Programaci n orientada a
objetos en Java
IniciaIizaci n y
finaIizaci n
Sin embargo s puede ser necesario realizar alguna
tarea no relacionada con la liberaci n de memoria
antes de la destrucci n del objeto, como por ejemplo
salvar el estado de la clase en un fichero o base de
datos
Java permite introducir c digo para este fin
implementando una operaci n p blica especial
denominada finalize. Esta operaci n es invocada
autom ticamente antes de la destrucci n del objeto por
parte del recolector de basura
Programaci n orientada a
objetos en Java
IniciaIizaci n y
finaIizaci n
Siguiendo nuestro ejemplo, vamos asegurarnos de que el estado de una cuenta
queda salvado en disco antes de su destrucci n, para poder ser recuperada
posteriormente. Para ello introducimos el c digo de escritura en fichero en la
operaci n finalize de la clase Cuenta
pub1ic void fina1ize() : ·hrows Ei1eNo·EoundExcep·ion, IOExcep·ion {

Ei1eOu·pu·S·ream fos = new Ei1eOu·pu·S·ream(numero + ".cn·"),
Ob_ec·Ou·pu·S·ream oos = new Ob_ec·Ou·pu·S·ream(fos),
oos.wri·eOb_ec·(·i·u1ar),
oos.wri·eE1oa·(sa1do),
oos.wri·eE1oa·(in·eresAnua1),
oos.c1ose(),
}
Problema: no es posible saber con seguridad en que
momento ser invocada finalize, puesto que el
recolector de basura puede decidir su eliminaci n en un
momento indeterminado, e incluso no ser eliminado
hasta el final de la ejecuci n de la aplicaci n
Una posible soluci n es ordenar al recolector de
basura que realice una limpieza de memoria inmediata,
para asegurar la finalizaci n de los objetos. Esto se
realiza mediante Runtime.getRuntime().gc()
Por motivos de eficiencia, lo anterior es poco
recomendable, sobre todo si se hace con frecuencia
Una mejor opci n es definir una operaci n ordinaria
con este mismo prop sito, a llamar de manera expl cita
cuando haya finalizado el uso del objeto
Introduciremos en la clase Cuenta una operaci n p blica salvar en lugar de finalize,
con la misma implementaci n. Tras finalizar las operaciones sobre la cuenta,
invocaremos a salvar para guardar los cambios realizados
Programaci n orientada a
objetos en Java
IniciaIizaci n y
finaIizaci n
Programaci n orientada a
objetos en Java
Creaci n de objetos
Creaci n de objetos
En Java los objetos se crean nicamente de forma
din mica. Para ello se utiliza el operador new, de
manera similar a C++
Los objetos en Java se utilizan siempre a trav s de
referencias. Las referencias son similares a los
punteros de C/C++, aunque su uso es mucho m s
sencillo
Por tanto los pasos a seguir en la creaci n de un
objeto son:
Declarar una referencia a la clase
Crear un objeto mediante el operador new invocando al constructor adecuado
Conectar el objeto con la referencia
Programaci n orientada a
objetos en Java
Creaci n de objetos
La creaci n de un objeto de la clase Cuenta se realizar a de la siguiente forma:
Cuen·a c, // Una referencia a un ob_e·o de 1a c1ase Cuen·a
c = new Cuen·a(18400200, "Redro Jim nez", 0.1f),
En cambio, los tipos b sicos (int, long, float, etc.) s
pueden ser creados directamente en la pila. Esto es
posible porque Java no los implementa realmente como
clases de objetos, por motivos de eficiencia y
comodidad, ya que su uso es muy frecuente
Cuen·a c,
f1oa· in,
1ong num,
in = 0.1f,
num = 18400200,
c = new Cuen·a(num, "Redro Jim nez", in),

También podría gustarte