Programación Orientada A Objetos
Programación Orientada A Objetos
Programación Orientada A Objetos
ORIENTADA A OBJETOS
Métodos, Interfaces.
2
Métodos
• La razón de establecer los atributos en vista privada, es
poder controlar la modificación del estado del objeto y no
permitir que este evolucione hacía estados incoherentes.
• Pero debemos establecer los mecanismos para poder
modificar el objeto, y son los métodos, el sistema
adecuado.
3
Métodos
Podemos organizar los métodos en tres tipos, teniendo en
cuenta aspectos sintácticos y semánticos:
• Constructores. Métodos que inicializan la instancia
• Métodos genéricos. Realizan acciones utilizando los
atributos
• Métodos para accesos directo a los atributos (getters &
setters). Estos métodos son opcionales y suelen utilizarse
más en clases de tipo “entidad”, es decir, que tienen
persistencia en bases de datos, o en los “beans”, donde
tienen una correspondencia con formularios. Aunque
estos métodos son realmente generales, los distinguimos
por separado por tener unas normas concretas de estilo.
4
MÉTODOS GENÉRICOS
Comencemos con el formato básico de un método:
MÉTODOS GENÉRICOS
Existen dos tipos de parámetros:
• Tipos primitivos (byte, short, int...). Estos se pasan por
valor, es decir, se realiza una copia del contenido en la
variable que sustenta el parámetro, y por lo tanto, si el
método modifica el parámetro no afecta a la variable del
mensaje entrante.
• Clases y arrays. Estos se pasan por referencia, es decir,
se pasa la dirección en el parámetro, así que,
modificaciones dentro del método afectan externamente.
Con la sentencia return, se finaliza el método. Si además
queremos devolver un valor se utiliza la sentencia return
valor.
6
MÉTODOS GENÉRICOS
Ampliando la clase Punto, se podrían añadir los siguientes
métodos:
CONSTRUCTORES
• Los constructores son métodos especiales que reúnen
las tareas de inicialización de los objetos de una clase;
por lo tanto, el constructor establece el estado inicial de
todos los objetos que se instancian.
• No es obligatorio definir constructores, si no se realiza,
existe un constructor por defecto sin parámetros.
• La ejecución del constructor es implícita a la creación de
una instancia.
• La restricción sintáctica del constructor es que debe
llamarse igual que la clase y no devuelve ningún tipo ni
lleva la palabra void.
11
SOBRECARGA DE MÉTODOS
• La sobrecarga es definir dos o más métodos con el mismo
nombre, pero con parámetros diferentes por cantidad o tipo.
• El objetivo de la sobrecarga es reducir el número de
identificadores distintos para una misma acción pero con
matices que la diferencian. La sobrecarga se puede realizar
tanto en métodos generales, como en constructores.
• La sobrecarga es un polimorfismo estático, ya que es el
compilador quien resuelve el conflicto del método a referenciar.
• Si definimos un constructor con parámetros, el constructor sin
parámetros deja de estar disponible; así que, si nos interesa,
se debe definir para su utilización.
13
Objetos
Recordemos que la clase representa el modelo para crear
objetos, pero son los objetos los elementos con los que
podemos trabajar. Los objetos ocupan memoria y tiene un
estado, que representa el conjunto de valores de sus
atributos.
Mensajes
• Una vez creado los objetos es posible pasarles mensajes,
o invocarles métodos, para solicitar una acción.
• El objeto establece a que método le corresponde el
mensaje recibido.
• Para enviar un mensaje se realiza con la notación punto.
Dependiendo si almacenamos el valor devuelto del
método, tenemos dos posibilidades:
23
THIS
• Dentro de la implementación de un método, a veces se
necesita referenciar a la propia instancia a la cual
pertenece. Para ello está la palabra reservada this. Un
ejemplo dentro de Punto sería: this.x = 3.
Resulta recomendable calificar con this a todas las
referencias a los atributos y métodos de la propia
clase; y resulta obligatorio cuando queramos distinguir
entre un parámetro y una variable de instancia con
el mismo nombre.
También referenciamos con la palabra this a nuestros
propios constructores, por ejemplo this(3,4).
25
Tarea
• Realizar la clase Rango y PruebaRango, representa un
número natural limitado hasta un
máximo.
• Atributos:
▫ valor (lectura y escritura). En la escritura se deben filtrar lo
valores fuera de rango
▫ maximo (sólo lectura). Sólo lectura significa que el método
setMaximo está calificado conprivate o, simplemente, no se
define el método.
• Constructores:
▫ Rango(int maximo, int valor)
▫ Rango()
• Métodos:
▫ void reset(), pone valor a cero
30
Elementos estáticos
• Todos los conceptos expuestos giran en torno a una idea
principal: la clase describe el comportamiento de
cada uno de sus objetos.
El presenta apartado pretende dar solución a cuestiones
de la clase y de todos los objetos en su generalidad. Por
ejemplo, si definimos una constante de una clase que
tenga siempre el mismo valor, es común a todos los
objetos, y por lo tanto, debe estar asociado a la clase y
no a las instancias.
Podemos definir atributos estáticos y métodos estáticos.
32
ATRIBUTOS ESTÁTICOS
• Para definirlos se antepone al tipo la palabra static; se
deben inicializar independientemente a los
constructores.
• Estos atributos están compartidos por todos los objetos
de la clase y son accesibles desde cada uno de ellos.
• Cualquier modificación por parte de un objeto afectará al
resto.
• Para el acceso a un atributo, en lugar de utilizar this, se
utiliza el nombre de la clase: Clase.atributo.
• Normalmente, las constantes asociadas a la clase son
buenas candidatas para realizarlas estáticas.
33
• Un ejemplo sería:
34
MÉTODOS ESTÁTICOS
• Al igual que los atributos, se antepone la palabra static al
tipo devuelto.
No puede utilizar en el código la palabra this, ya que está
asociado exclusivamente a las instancias. Se pueden
acceder a los atributos estáticos del mismo modo que
pueden las instancias, anteponiendo el nombre de la
clase: Clase.atributo.
Se permite definir un código estático para inicializar los
atributos estáticos. Su ejecución se dispara una sola vez
al principio. Tiene el siguiente formato:
35
CLASE STRING
• La clase String representa una cadena de caracteres. Su
contenido no puede cambiar, por lo tanto, cada vez que
se modifica, se crea un nuevo String. Consume menos
recursos para el almacenamiento pero las operaciones de
modificación resultan costosas en el tiempo. Si van a
existir numerosas modificaciones se deberá utilizar la
clase StringBuffer.
Todos los literales de cadena como “abc” se implementan
como una instancia de String, podemos realizar la
siguiente asignación:
39
CLASE STRINGBUFFER
• Representa una cadena de caracteres con una estructura
interna que facilita su modificación, ocupa más que la
clase String, pero las operaciones de modificación son
muchos más rápidas.
• Para la modificación del contenido, cuenta con los
métodos insert y append. Mirar el API para mayor
documentación.
• En el siguiente código, el bucle realizado con StringBuffer
es aproximadamente 1000 veces más rápido que el bucle
realizado con String. Es importante tener en cuenta, que
cuando se requiera modificar una cadena de forma
dinámica, es mucho mejor la clase StringBuffer.
44
45
• Las clases tienen constantes que nos pueden ser útiles, por ejemplo,
todas tienen MAX_VALUE y MIN_VALUE, Double además tiene NaN,
POSITIVE_INFINITY. NEGATIVE_INFINITY...
Javadoc
• Los comentarios JavaDoc están destinados a describir,
principalmente, las clases y los métodos. Existe una
utilidad de Sun Microsystems llamada javadoc.exe para
generar APIs en formato HTML de un documento de
código fuente Java.
• Recordar que los comentarios javadoc son /** ... */. Se
utiliza el carácter @ como anotación especial,
para describir las etiquetas de documentación.
• Los comentarios se deben colocar justo antes del
elemento a documentar.
• Se permite añadir elementos HTML a la documentación
para enriquecer su presentación.
49
ANOTACIONES
• Generales
@see referencia. Realiza un enlace. Ejemplos de
referencia son: #metodo(); clase#metodo();
paquete.clase; paquete.clase#metodo(); <a href=”...”>
enlace estándar de html </a>
@since. Indica en la versión que apareció este
elemento respecto a la secuencia de versiones
aparecidas a lo largo del tiempo
50
• Paquetes
@see, @since
@deprecated. Indica que este elemento es antiguo y
que no se recomienda su uso porque
posiblemente desaparecerá en versiones posteriores. Se
debe indicar la alternativa correcta
51
• Clases e interfaces
@see, @since, @deprecated
@version. Versión y fecha
@author. Nombre del autor
52
• Variables y constantes
@see, @deprecated
53
• Métodos
@see, @since, @deprecated
@param. Definición de un parámetro, es obligatorio.
*@param parámetro descripción
@return. documenta el dato devuelto, es obligatorio.
*@return descripción
@throws. Excepción lanzada por el método. *@throws
clase descripción
54
TAREA
• Implementar por completo la clase Mes
• Realizar la clase Pila, gestiona una pila de cadenas
(String) (último en entrar, primero en
salir). Para su implementación se apoya en un array
60
TAREA
• Atributos:
▫ capacidad (sólo lectura) representa el tamaño del array. Sólo se
puede establecer en el
constructor
▫ array (sin acceso). Significa que los métodos get/set son private o
no se implementan
▫ cima (sin acceso) apunta al último elemento apilado, -1 si no hay
elementos
• Constructores:
▫ Pila(int capacidad), Pila()
• Métodos:
▫ void borrarTodo(), borra toda la pila
▫ boolean apilar(String elemento). Añade un elemento en la cima de
la pila, si no está llena.
Devuelve un valor lógico indicando si se ha podido añadir
▫ String desapilar(). Devuelve el String que se encuentra en la cima
de la pila, devuelve null
si la pila está vacía
▫ int tamaño(). Devuelve el número de String que contiene la pila
61
Herencia
• La herencia es uno de los mecanismos fundamentales de la
programación orientada a objetos, por medio del cual una clase se
construye a partir de otra. Una de sus funciones más importantes es
proveer el polimorfismo.
La herencia relaciona las clases de manera jerárquica; una clase
padre, superclase o clase base sobre otras clases hijas, subclases o
clase derivada. Los descendientes de una clase heredan todos los
atributos y métodos que sus ascendientes hayan especificado como
heredables, además de crear los suyos propios.
En Java, sólo se permite la herencia simple, o dicho de otra manera,
la jerarquía de clases tiene estructura de árbol. El punto más alto de
la jerarquía es la clase Object de la cual derivan todas las demás
clases.
Para especificar la superclase se realiza con la palabra extends; si no
se especifica se hereda de Object.
66
REDEFINICIÓN DE MÉTODOS
• A veces, los métodos heredados de la superclase no son
adecuados para la subclase. En este caso, debemos
redefinir (sobrescribir) el método.
• Supongamos que queramos realizar una clase Punto3D
que hereda de PuntoTiempo para añadirle una tercera
dimensión. En este caso, el método heredado modulo ya
no es válido y lo debemos redefinir.
• Es recomendable añadir la directiva @Override para
asegurarnos que no realizamos una sobrecarga por
error. A continuación mostramos el código Java.
75
76
CLASE OBJECT
• Esta clase es la superclase de todas. Algunos de sus
métodos son:
public String toString(). Este método devuelve una
cadena con la descripción de la clase. Es importante
redefinir este método para adaptarlo a nuestra
descripción, es muy útil en los procesos de depuración.
Por ejemplo, en la clase Punto podría devolver los
valores x e y entre paréntesis y separados por una coma:
[3,5]. Se recomienda que siempre se redefina este
método.
78
• Su código quedaría:
79
• Su código quedaría:
80
81
• Un ejemplo sería:
82
FINAL
• Si lo aplicamos a una clase, no se permite que existan
subclases.
• Si lo aplicamos a un método, no se permite que
subclases redefinan el método.
84
Clases abstractas
• Una clase abstracta es una clase que no se puede instanciar, pero si
heredar. También, se pueden definir constructores. Se utilizan para
englobar clases de diferentes tipos, pero con aspectos comunes. Se
pueden definir métodos sin implementar y obligar a las subclases a
implementarlos.
Por ejemplo, podemos tener una clase Figura, que representa una
figura general, y subclases con figuras concretas (Triangulo,
Circulo...). Podemos establecer métodos comunes como dibujar, que
sin conocer el
tipo de figura, sea capaz de dibujarla. Pero para que esto funcione
correctamente, cada figura concreta debe implementar su versión
particular de dibujar.
Si añadimos el calificador abstract después del calificativo public del
método, le convertimos en abstracto y no hace falta que lo
implementemos, basta con definirlo. Si añadimos abstract después
del calificativo public de la clase, la convertimos en clase abstracta;
esta acción es obligatoria si algún método es abstracto.
85
TAREA
• Crear las clases Figura, Triangulo y Cuadrado
90
Interfaces
• Un interface en Java es un tipo abstracto que representa un
conjunto de métodos que las clases pueden implementar y un
conjunto de constantes estáticas, es similar a una clase
abstracta pura. Igual que las clases abstractas, los interfaces
no se puede instanciar. Su utilidad es crear variables de tipo
interface e independizarse de las clases que contiene.
• Para definir un interface se realiza de forma similar a una clase
abstracta pero con la palabra interface en lugar de class.
Pueden existir variables o parámetros de tipo interface, pero
sólo pueden contener instancias de clases que hayan
implementado el interface.
Una clase puede implementar uno o varios interfaces, para ello
se utiliza la palabra implements
91
• Veamos un ejemplo :
92
COMPATIBILIDAD DE VARIABLES
• Una variable de tipo interface puede contener instancias
de cualquier clase que implemente el interface.
94
TAREA
• Implementar las clases CA y CB, donde CA hereda
de CB
95
TAREA
• Dado el código: CA a = new CB(1,2,3); ¿qué valor
devuelve “a.suma();”?
Implementar las clases CC y CD
96
TAREA
• Añadir e implementar el método int dobleSuma() en
CC
Definir el interface IA, IB e IC
97
TAREA
• Ampliar CA para que implemente IC
interface Comparable, método compareTo(Object
uno, Object dos) (si uno es <, == o > que
dos, devuelve -1, 0, +1 respectivamente
Ampliar CA para que implemente Comparable
98
Relación de clases
• Una aplicación orientada a objetos es una colección de
objetos, algunos jerárquicos, que colaboran entre sí para dar
una funcionalidad global. Cada objeto debe asumir una parte
de las responsabilidades y delegar otras a los objetos
colaboradores.
Existirá un objeto que asume las funciones de la aplicación
principal, será el encargado de crear las instancias oportunas y
tener un único punto de entrada (main).
Cabe hacernos una pregunta fundamental, ¿en cuántos
objetos debemos descomponer la aplicación? Si realizamos
objetos muy pequeños, cada uno de ellos será fácil de
desarrollar y mantener, pero resultará difícil la integración. Si
realizamos objetos grandes, la integración será fácil, pero el
desarrollo de los objetos complicado. Se debe buscar un
equilibrio.
100
RELACIÓN DE USO
• Se dice que existe una relación de uso entre la clase A y la
clase B, si un objeto de la clase A lanza mensajes al objeto de
la clase B, para utilizar sus servicios.
Es una relación que se establece entre un cliente y un servidor,
en un instante dado, a través de algún método. No es una
relación duradera, sino esporádica.
102
RELACIÓN DE AGREGACIÓN
• Se dice que la clase A tiene una relación de agregación
con la clase B, si un objeto de la clase A delega
funcionalidad en los objetos de la clase B.
El ciclo de vida de ambos no coincide. La clase A delega
parte de su funcionalidad, pero no crea el objeto B. Varios
objetos pueden estar asociados con el objeto B. Al objeto
A, le deben pasar la referencia del objeto B. Es una
relación duradera entre cliente (A) y servidor (B), en la
vida del cliente.
103
104
RELACIÓN DE COMPOSICIÓN
• Se dice que existe una relación de composición entre la
clase A y la clase B, si la clase A contiene un
objeto de la clase B, y delega parte de sus funciones en
la clase B.
Los ciclos de vida de los objetos de A y B coinciden. El
objeto A es el encargado de crear la instancia de
B y de almacenarla, siendo su visibilidad privada. Cuando
se destruye A, también se destruye B.
Por ejemplo, se pretende realizar una clase llamada
Agenda y para ello se apoya en la clase Lista, es
decir, dentro de la clase Agenda se crea una instancia de
la clase Lista, y algunas de las funcionalidades
que aporta la clase Agenda se realizan con los métodos
de la clase Lista.
105
106
Beneficio de la herencia
• Es importante realizar un uso de la herencia para
optimizar el código y evitar las redundancias.
Paquetes
• Los paquetes agrupan un conjunto de clases que trabajan
conjuntamente sobre el mismo ámbito.
• Es una facilidad ofrecida por Java para agrupar sintácticamente
clases que van juntas conceptualmente y definir un alto nivel de
protección para los atributos y los métodos.
• La ventaja del uso de paquetes es que las clases quedan ordenadas
y no hay colisión de nombres. Si dos programadores llaman igual a
sus clases y luego hay que juntar el código de ambos, basta explicitar
a qué paquete nos referimos en cada caso.
• La forma de nombrar los paquetes es con palabras (normalmente en
minúsculas) separadas por puntos, estableciendo una jerarquía de
paquetes; la jerarquía de paquetes es independiente de la jerarquía
de clases.
• Las clases deben almacenarse en una estructura de carpetas que
coincidan con la estructura de paquetes.
115
Tanto los ficheros *.java como los ficheros *.class, se deben almacenar
en una jerarquía de carpetas que coincidan con los nombres de los
paquetes. En la Figura 4. Paquetes en JavaFigura 4 se muestra cómo
quedaría la jerarquía de carpetas.
116
117
Visibilidad
• Hasta ahora hemos trabajado con dos tipos de visibilidad:
public y private. Recordemos que un elemento público es
visible para todos y privado sólo para uso interno.
• En Java se distinguen dos tipos más de visibilidad: protected y
sin calificador (friendly).
• Cuando calificamos a un elemento como protected, significa
que es visible dentro del mismo paquete o cualquier subclase
de forma directa (mediante super.elemento).
• Si pretendemos que una subclase acceda de forma directa a
los atributos de la superclase, el calificador apropiado es
protected.
• Cuando dejamos a un elemento sin calificar (friendly), significa
que sólo es visible dentro del mismo paquete.
121
TAREA
• Probar las clases anteriores
• AVANZADO. Implementar la aplicación AGENDA.
Lleva una agenda de usuarios. Permite
las acciones básicas: añadir, borrar, buscar y ver toda
la agenda.
122
FIN CAPITULO
GRACIAS POR SU ATENCIÓN
Referencia Bibliográfica:
• Jesús Bernal Bermúdez, Luis Fernández Muñoz, (2012)
Programación Orientada a Objetos con Java, Master
Universitario en Ingeniería Web, Universidad Politécnica de
Madrid.