Escolar Documentos
Profissional Documentos
Cultura Documentos
LIDIA
Laboratorio de Investigacin y
desarrollo en Inteligencia Artificial
Departamento de Computacin
Universidade da Corua, Espaa
Objetivos
Conocer y analizar las principales propiedades
de la orientacin a objetos
Estas propiedades incluirn aquellas que son
compartidas por los tipos abstractos de datos
(como abstraccin, encapsulacin,
modularidad), como aquellas propias de la
orientacin a objetos (herencia, polimorfismo,
ligadura dinmica, etc.).
Estudiar cmo un lenguaje como Java
implementa, en mayor o menor medida, dichas
propiedades bsicas.
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 2
ndice
1. Abstraccin
2. Encapsulamiento
3. Modularidad
4. Jerarqua
5. Polimorfismo
6. Tipificacin
7. Ligadura dinmica
Ventajas
El hecho de fragmentar un programa en componentes
individuales suele contribuir a reducir su complejidad
Permite crear una serie de fronteras bien definidas y dentro del
programa aumenta la comprensin del mismo.
Sinergia entre abstraccin, encapsulamiento y
modularidad
Un objeto proporciona una frontera bien definida alrededor de
una sola abstraccin, el encapsulamiento y la modularidad
proporcionan barreras que rodean a esa abstraccin.
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 10
Modularidad
Definicin y caractersticas
Abstraccin, Encapsulamiento y Modularidad
mensaje
Mdulo
Parte pblica
Objeto 1
Objeto 2
Estado
Estado
Interfaz
Interfaz
Parte privada
Objeto 3
Objeto 4
Objeto 5
Estado
Estado
Interfaz Estado
Interfaz
Interfaz
11
Modularidad
Modularidad en Java
Clases
Encapsulan los atributos y mtodos de un tipo de
objetos en un solo compartimiento
Ocultan, mediante los especificadores de acceso, los
elementos internos que no se pretende publicar al
exterior.
Esta proteccin es altamente configurable al existir
varios niveles de acceso:
public
protected
por defecto (package)
private
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 12
Modularidad
Modularidad en Java
Ficheros
Unidades fsicas de compilacin
Dentro de un fichero .java pueden residir varias
clases con las siguientes restricciones
Slo puede haber una clase pblica por fichero
El nombre del fichero debe ser el mismo que el de la clase
pblica
Si no existe ninguna clase pblica tampoco existe ninguna
restriccin con respecto al nombre del fichero
Compilacin
La compilacin de un fichero .java genera tantos ficheros
.class (bytecodes) como clases existen en dicho fichero
Para facilitar la compilacin Java recompila los ficheros
.java si tienen el mismo nombre que un fichero .class
pero con una fecha posterior.
...
paqueteuno.MiClase x = new
Definicin
paqueteuno.MiClase();
fichero MiClase.java
...
package paqueteuno;
Jerarqua de generalizacin/especializacin:
Define relaciones ES_UN
Tambin se conoce como herencia
Jerarqua de agregacin:
Define relaciones ES_PARTE_DE
Tambin se conoce como composicin
Subclases y superclases
Una subclases hereda de una o ms superclases y
aumenta o redefine la estructura y el comportamiento
de dichas superclases
Las subclases representan conceptos especializados
Las superclases representan generalizaciones de los
aspectos comunes de las subclases
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 21
Jerarqua
Herencia
Representacin interna de los objetos
...
Tabla de
... punteros a
mtodos de
instancia
edad = 21 setEdad(int)
setGenero(int)
elementos propios
getMayoriaEdad()
Informacin de la clase
setMayoriaEdad(int)
Estudiante
getTitulacion()
setTitulacion(int)
calcularMatricula()
elementos propios
getMayoriaEdad()
Puntero a
la clase
setMayoriaEdad(int)
Informacin de la clase
nombre Profesor
getNombre()
apellidos mayoriaEdad = 18
setNombre(String)
edad HOMBRE = 1
Puntero del getApellidos()
objeto genero MUJER = 2
setApellidos(String)
departamento DESCONOCIDO = 99
getEdad()
categoria
setEdad(int)
dedicacin
getGenero()
antiguedad
setGenero(int)
calcularSueldo()
Estudiante
Persona
Object
}
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 29
Jerarqua
Herencia
Herencia y constructores
Los constructores no se heredan, son exclusivos de la clase en
la que se definen
Por ello la primera instruccin de un constructor de una
subclase es llamar al constructor de la superclase, y este a su
vez al de su superclase hasta llegar a la clase Object
Esta llamada generalmente est implcita y consiste en una
llamada al constructor sin parmetros. Si queremos hacerla
explcita deberemos poner super() como primera instruccin
Si el constructor sin parmetros no existe la llamada implcita
fallar y ser necesario hacer una llamada explcita:
super(param1, param2)
Clase raz
Clases interiores
Clases hoja
32
Jerarqua
Clases abstractas
Caractersticas
Representan conceptos generales que agrupan
mtodos comunes y dejan para la implementacin de
las subclases mtodos especficos.
No pueden ser instanciadas
Un mtodo abstracto slo puede pertenecer a una
clase abstracta, pero una clase abstracta puede tener
mtodos no abstractos
Las subclases de una clase abstracta deben
implementar los mtodos abstractos o declararse
como abstractas.
33
Jerarqua
Clases abstractas
Circulo Rectangulo
X: int
X: int Y: int
Y: int Estado
largo: int
radio: int ancho: int
Figura
X: int
Y: int
calcularPerimetro(): float
calcularArea(): float
Circulo Rectangulo
X: int
X: int Y: int
Y: int largo: int
radio: int ancho: int
Caractersticas
Se definen con la palabra clase interface y no class
Contienen las cabeceras de mtodos que son, implcitamente,
pblicos y abstractos, pero no incluyen los cuerpos de los
mtodos
Pueden contener atributos pero sern implcitamente static y
final, es decir, constantes de clase
Ejemplo:
interface FiguraInterfaz
{
float calcularPerimetro();
float calcularArea();
}
Definicin del
public interface Iterator
{ opcional. Eso en la semntica de
boolean hasNext(); las bibliotecas de colecciones de Java
Object next(); significa que la clase implementadora
interfaz Iterator }
void remove(); no est obligada a darle una
implementacin.
Import java.lang.annotation.*;
Anotamos la anotacin indicando que
@Retention(RetentionPolicy.RUNTIME) queremos que su informacin se
@interface EnDesarrollo mantenga en tiempo de ejecucin (
{ int porcentaje(); } para utilizarla con la reflexin)
@EnDesarrollo (porcentaje=50)
class MiClase { } La palabra clave para definir
anotaciones es @interface, el resto de
public class AnotacionSimple la declaracin es como si fuera un
{ interface tpico. En este caso
public static void main(String[] args) indicamos que existe un mtodo que
{ devuelve un porcentaje
MiClase x = new MiClase();
Class c = x.getClass(); Anotamos una clase con la anotacin
if (c.isAnnotationPresent(EnDesarrollo.class)) EnDesarrollo, le damos un valor a
{ porcentaje (el compilador nos evita
System.out.println("Esta clase est en desarrollo"); tener que escribir la sobreescritura del
EnDesarrollo ed = (EnDesarrollo)c.getAnnotation(EnDesarrollo.class); mtodo porcentaje por MiClase)
System.out.println("Porcentaje = " + ed.porcentaje());
} Usamos la reflexin para obtener
} informacin en tiempo de ejecucin del
}
objeto de tipo MiClase
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 52
Jerarqua
Interfaces
5. Como contenedores de elementos globales al
programa
En Java no existen variables globales como en
otros lenguajes. Los interfaces pueden utilizarse
para incluir aspectos comunes que deban
compartir clases heterogneas, como por ejemplo:
constantes
abstractas?
API de colecciones <<interface>>
Set AbstractCollection
<<interface>>
List
Interfaces en un primer
nivel <<interface>>
SortedSet AbstractSet AbstractList
Clases abstractas en un
segundo nivel TreeSet HashSet ArrayList AbstractSequentialList
Tienes la opcin de
implementar el interfaz <<interface>>
...
...
}
...
}
.
public void setGenero(int e)
{ p.setGenero(e); }
}
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 63
ndice
5. Polimorfismo
Tipos de polimorfismo
Polimorfismo de inclusin
Polimorfismo paramtrico
Sobrecarga
Coercin
Paramtrico
Universal o
verdadero
De Inclusin
Polimorfismo
Sobrecarga
Ad hoc o
aparente
Coaccin
66
Polimorfismo
Tipos de polimorfismo
Polimorfismo universal o verdadero
Consiste en que pueden existir valores que pueden
pertenecer a varios tipos, y se utiliza el mismo
cdigo para tratar los diferentes tipos
Tenemos dos variantes del polimorfismo universal, el
polimorfismo paramtrico y el de inclusin
Un vector se
define :Object :Object :Object :Object :Object
internamente
como un Array nombre =
marca = "Ford"
de Object "Mich"
import java.util.*;
public T getValor()
{ return valor; }
77
Polimorfismo
Polimorfismo paramtrico
Otras ventajas de la versin 1.5
Autoboxing / autounboxing
Los tipos bsicos se convierten automticamente a sus clases
asociadas y viceversa
Foreach
Las colecciones pueden recorrerse sin usar iteradores
No hay una palabra clave foreach por compatibilidad
Ejemplo:
Sumamos de una coleccin de enteros cuntos son iguales a 5
public int antes(Collection c) public int ahora(Collection<Integer> c)
{ {
int num=0; int num=0;
for (Iterator i = c.iterator(); i.hasNext();) for (Integer i : c)
{ if (i.equals(5))
if (i.next().equals(new Integer(5))) num++;
num++; return num;
} }
return num;
}
.
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 79
Polimorfismo Paramtrico
Genericidad y subclases
Antes de los genricos para crear un mtodo que imprimiera todos
los elementos de una coleccin hacamos:
public void printCollection(Collection c)
{
for(Object e : c)
System.out.println(e);
}
.
.
.
.
.
.
.
.
long sueldo()
{ return base + (10000 * anhos); }
}
95
Polimorfismo
Sobrecarga
Especificadores de visibilidad en sobrecarga
El especificador de visibilidad de un mtodo que
sobrescribe a otros debe proporcionar por lo menos
la misma visibilidad que el mtodo sobrescrito.
Es decir:
Si el mtodo sobrescrito tena visibilidad public, el mtodo
que sobreescribe debe ser public.
Si el mtodo sobrescrito tena visibilidad protected, el
mtodo que sobreescribe debe ser public o protected.
Si el mtodo sobrescrito tena visibilidad package, el mtodo
que sobreescribe no puede ser private.
No se especifica nada si el mtodo sobreescrito tena
visibilidad private ya que estos mtodos no pueden
ser sobrescritos
96
Polimorfismo
Coercin
Coercin (o coaccin)
Es una operacin semntica por la cual se convierte un
argumento a el tipo esperado por una funcin para evitar que se
produzca un error de tipos.
Las coerciones pueden hacerse estticamente, insertndolas
entre los argumentos y las funciones en tiempo de compilacin
(seran los conocidos type cast o conversiones de tipos), o
pueden ser determinadas dinmicamente por tests en tiempo de
ejecucin sobre los argumentos.
Suele ser muy comn en todo tipo de lenguajes, incluso en los
fuertemente tipados, para evitar errores triviales con los tipos.
Ejemplo: Una funcin que acepta parmetros float aceptar
sin problemas que le pasemos un int, simplemente convertir
ese int a un float en tiempo de ejecucin
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 97
ndice
6. Tipificacin
Introduccin
Comprobacin de tipos
Esttico
Estricto o fuerte
Dinmico
Tipado esttico
Consiste en que el tipo exacto de cada expresin
puede ser determinado en tiempo de compilacin
mediante un anlisis esttico del programa.
El tipado esttico permite detectar incongruencias en
tiempo de compilacin pero, sin embargo, puede
llegar a ser muy restrictivo.
Un ejemplo de tipado esttico sera el lenguaje
Pascal estndar.
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 100
Tipificacin
Comprobacin de tipos
Tipado estricto o fuerte
Es un requisito ms dbil que el tipado esttico y
consiste en que todas las expresiones de tipos
tienen que ser consistentes en tiempo de
compilacin.
El compilador garantizar que el programa se
ejecutar sin errores de tipos.
Muchas veces se incluye el tipado esttico y el
tipado estricto dentro de una misma categora.
El tipado fuerte es propio de los lenguajes orientados
a objetos como Java, Object Pascal o C++, aunque el
nivel de exigencia en cada uno de ellos puede variar.
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 101
Tipificacin
Comprobacin de tipos
Consistencia (definida a travs de tres restricciones):
Restriccin de declaracin.
Todas las entidades del lenguaje (variables, objetos, atributos)
deben tener un tipo declarado (que como hemos visto puede ser un
tipo bsico o una clase). Adems cada mtodo o funcin debe
declarar cero o ms argumentos formales especificando un tipo
para cada uno.
Restriccin de compatibilidad.
En cada asignacin x = y, y en cada llamada a una rutina en que se
usa y como argumento real para el argumento formal x, el tipo de la
fuente y debe ser compatible con el tipo de destino x. La definicin
de compatibilidad se basa en la herencia, y es compatible con x si
es descendiente de x (es lo que habamos visto en el tema anterior
como polimorfismo de inclusin).
Restriccin de llamada a caracterstica.
Para poder llamar a una caracterstica (atributo o un mtodo) f
desde la clase X, f tiene que estar definida en X o en uno de sus
antecesores.
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua 102
Tipificacin
Comprobacin de tipos
Cul es el resultado de la ejecucin del siguiente cdigo?
class Animal
{
// El mtodo ladra no est definido en Animal
}
class Perro extends Animal
{
public void ladra() { ... }
}
...
Animal unAnimal = new Perro();
unAnimal.ladra();
...
Ejemplo de pesimismo
Al ejecutar unAnimal.ladra() si en unAnimal tenemos un Perro la
cosa funcionara.
Pero no hay nada que garantice que en unAnimal hay un perro
ya que puede haber otro tipo de animales que no ladran (gatos,
canarios, etc.)
Figura Calculo
X: int
Y: int
calculaAreaFiguras(Figura[] ListaFiguras)
calcularArea(): float
calcularPerimetro(): float
Polimorfismo
ListaFiguras = new Figura[10];
Figura Calculo
Cuadrado
X: int
lado: int
Y: int
calculaAreaFiguras(Figura[] ListaFiguras)
calcularPerimetro(): float
calcularArea(): float
calcularArea(): float
calcularPerimetro(): float
static void f ()
{ System.out.println( "Padre.f" ); }
}
static void f ()
{ System.out.println( "Hijo.f" ); }
;)
115
Ligadura dinmica
Implementacin
Caractersticas
Puede variar de un lenguaje a otro pero bsicamente presentan
unas caractersticas comunes.
Mtodos que necesitan ligadura dinmica
Deben presentar ligadura dinmica slo aquellos que pueden ser
redefinidos.
Por ejemplo, en Java los mtodos de clase y los mtodos de
instancia privados y/o finales no presentan ligadura dinmica.
En Java si no se especifica nada se entender que el mtodo puede
ser redefinido y por tanto debe presentar ligadura dinmica.
En otros lenguajes como Object Pascal o C++ los mtodos por
defecto presentan ligadura esttica, si queremos que su ligadura
sea dinmica es necesario incluirle la directiva virtual (por eso los
mtodos con ligadura dinmica se conocen como mtodos
virtuales). El mtodo que sobreescribe de incluir la directiva
override
Objeto de la clase A
Apuntan a la misma
direccin que los mtodos
de la superclase
A()
Puntero a Informacin de la
la clase clase A
getNombre()
Puntero del constructores
objeto base
... setNombre(String)
anhos met. no virtuales
VMT sueldo()
nombre
pagaExtra()
numProyectos
rendimiento()
Apuntan a
cdigo nuevo
118
Ligadura dinmica
Implementacin
Ejemplo de VMTs
Las VMTs de las clases C y D para los mtodos sueldo() y pagaExtra()
apuntarn al cdigo incluido en la clase Personal.
En la clase A slo la entrada de pagaExtra() apunta a Personal, ya que
no ha sido redefinido, sin embargo la entrada de sueldo() apuntar a la
versin del mtodo incluida en la subclase A. Lo mismo para B.
Los mtodos getNombre y setNombre no se incluyen en la tabla de
mtodos virtuales porque se han definido final.
El mtodo rendimiento() definido en la clase A tambin debe ser
incluido en la VMT ya que, aunque no es redefinido por ninguna clase,
puede ser redefinido en un futuro (no es privado ni final).
long pagaExtra()
{ return base; }
}
VMT D
class A extends Personal VMT A
1 long sueldo() {
... long sueldo() 1
2 long pagaExtra() long sueldo()
{ return long pagaExtra() 2
(100000*numProyectos);}
float rendimiento() 3
float rendimiento()
{ return
numProyectos/anhos;}
}
120
Ligadura dinmica
Eficiencia
Principal inconveniente de la ligadura dinmica: la eficiencia.
Llamadas a mtodos virtuales
Ocupan ms cdigo que la llamada a un mtodo esttico y consume
ms tiempo
Aunque esta penalizacin es pequea y est acotada por una
constante (es independiente del nivel de herencia en el que nos
encontremos)