You are on page 1of 7

Programación orientada a objetos en Java

Índice
La programación orientada a objetos (POO) ... 2
Un ejemplo: una clase Punto ... 4
Curso de Java
Programas orientados a objetos ... 7
Otro ejemplo: una clase Circulo ... 9
Encadenamiento de mensajes ... 10
Los atributos ... 12

Programación orientada
Los objetos ... 13
Herencia ... 14

a objetos en Java
Herencia y pasos de mensajes ... 20
Polimorfismo y vinculación dinámica ... 21
Relaciones entre clases ... 25
POO y reutilización ... 26

...
El lenguaje Java — Tema 3 — POO en Java
Luis Hernández Yáñez
Curso de Java Tema 3 – POO en Java - 1
Carlos Cervigón Rückauer

La programación orientada a objetos (POO) La programación orientada a objetos (POO)

Una nueva forma de ver las cosas 9 La definición de los ejemplares (estado y comportamiento)
Se puede decir que la POO es la programación con TAD (tipos se encuentra en la clase.
abstractos de datos) más una serie de mecanismos adicionales. 9 Las clases encapsulan código y datos.
Dejando aparte esos otros mecanismos, podemos establecer 9 Los ejemplares de las clases son los objetos.
un paralelismo entre los TAD y la POO: 9 La clase define atributos (datos) y métodos (operaciones).

Programación con TAD POO 9 Vista externa de una clase (su interfaz):
Nombre y forma de uso de sus métodos.
Definición TAD Clase 9 Los atributos han de ocultarse (ocultamiento de la información).

Estado Datos Atributos 9 Cada objeto (ejemplar) contiene su propio conjunto de atributos.
9 Cada método declarado en la clase constituye un servicio que
Comportamiento Operaciones Métodos proporcionan todos los objetos de esa clase.
Ejemplares Variables Objetos 9 Todos los objetos de una misma clase proporcionan los mismos
servicios (tienen un mismo comportamiento).

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 3 – POO en Java - 2 Curso de Java Tema 3 – POO en Java - 3
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Un ejemplo: una clase Punto Un ejemplo: una clase Punto

public class Punto { Nombre de la clase: Punto La clase Punto:


double _x;
double _y; Atributos: _x _y Define dos atributos: _x e _y
public double x() { Privados: accesibles Cada ejemplar (objeto) tendrá sus propias coordenadas x e y.
I sólo en los métodos
return _x;
N } Métodos: Define cinco métodos:
T public double y() { x() x(double) x(), y(), x(double), y(double) y print().
E return _y; y() y(double) Todos los objetos de la clase Punto proporcionan cinco servicios:
R } print()
x(), y(), x(double), y(double) y print().
F public void x(double d) {
Creación de ejemplares (objetos) de la clase Punto:
_x = d;
A
} Todo lo que no es interfaz Punto p1 = new Punto(), p2 = new Punto();
Z public void y(double d) { es implementación
p1 tiene sus propios valores _x e _y, distintos de los de p2.
_y = d;
} Cuando se quiere que un determinado objeto realice un
public void print() { determinado servicio (método), se le pasa un mensaje:
System.out.print("(" + _x + "," + _y + ")");
} p1.y(12) Paso del mensaje y() al objeto p1.
} Punto.java p2.print() Paso del mensaje print() al objeto p2.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 3 – POO en Java - 4 Curso de Java Tema 3 – POO en Java - 5
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Un ejemplo: una clase Punto Programas orientados a objetos

Los objetos de una clase entienden tantos mensajes como métodos Un programa orientado a objetos está compuesto por:
estén definidos en la clase (mismo comportamiento). 9 Un conjunto de clases que describen los objetos
A los objetos de clase Punto se les puede pasar cinco mensajes: que maneja la aplicación.
9 x() 9 Un programa principal que pone en marcha
9 y() el mecanismo de paso de mensajes: el método main().
9 x(double)
9 y(double) public class PruebaPunto {
9 print() public static void main(String[] args) {
Paso de mensajes: Punto unPunto = new Punto();
unPunto.x(2);
objeto . mensaje (argumentos) unPunto.y(7); Pasos de mensajes
unPunto.print();
Cuando se pasa un mensaje a un objeto se busca en la clase un
System.out.println();
método que coincida con el mensaje (nombre y argumentos):
}
Si se encuentra tal método, se ejecuta el código de ese método. }
Si no se encuentra tal método: el objeto no entiende el mensaje. PruebaPunto.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 3 – POO en Java - 6 Curso de Java Tema 3 – POO en Java - 7
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Programas orientados a objetos Otro ejemplo: una clase Circulo

public class Circulo {


Cada paso de mensaje provoca la ejecución del correspondiente Punto _centro; Atributo objeto de otra clase
método definido en la clase del objeto receptor. double _radio;
public Punto centro() {
El código del método puede ser: return _centro;
9 Una secuencia de instrucciones que no involucre objetos }
public double radio() {
(programación basada en tipos estándar) return _radio;
9 Una secuencia de pasos de mensajes a otros objetos }
public void centro(Punto p) {
(normalmente a los objetos atributos) _centro = p;
9 Una combinación de los dos casos anteriores }
public void radio(double r) {
(programación mixta o híbrida) _radio = r;
Si la ejecución de un método no genera otros pasos de mensajes, } Paso de mensaje
el método se considera elemental. public void print() { al objeto atributo
System.out.print("[");
Si la ejecución de un método genera otros pasos de mensajes, _centro.print();
se produce un encadenamiento de mensajes. System.out.print("," + _radio + "]");
} Circulo.java
}
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 3 – POO en Java - 8 Curso de Java Tema 3 – POO en Java - 9
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Encadenamiento de mensajes Encadenamiento de mensajes

Ejecución de un programa orientado a objetos El encadenamiento de mensajes se produce cuando la ejecución


El programa crea objetos y les pasa mensajes. de un método consiste en pasos de mensajes.
public class PruebaCirculo { unCirculo.print()
El objeto unCirculo es de clase Circulo
public static void main(String[] args) {
Punto unPunto = new Punto(); public class Circulo {
unPunto.x(2); ...
unPunto.y(7); public void print() {
Circulo unCirculo = new Circulo(); System.out.print("[");
unCirculo.centro(unPunto); _centro.print(); public class Punto {
unCirculo.radio(3); ... ...
unCirculo.print(); } public void print() {
System.out.println(); } El atributo _centro ...
es un objeto }
}
de la clase Punto }
}
Cada mensaje que se pasa provoca
El encadenamiento de mensajes termina en los métodos elementales
la ejecución del correspondiente
PruebaCirculo.java (se vuelve del método sin que se produzcan otros pasos de mensaje).
método de la clase del objeto receptor.
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 3 – POO en Java - 10 Curso de Java Tema 3 – POO en Java - 11
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Los atributos Los objetos

Como hemos visto, los atributos pueden ser: En los programas orientados a objetos se pueden distinguir
9 Datos elementales (de tipos incorporados en el lenguaje). distintos objetos, atendiendo a su existencia y su uso:

9 Ejemplares (objetos) de otras clases. 9 Objetos globales: creados en el programa principal.


Los objetos contienen objetos. Existen durante toda la ejecución del programa
(una vez creados con new).
Resulta habitual que las clases incluyan, entre otros, métodos
accedentes y métodos mutadores para los distintos atributos: 9 Objetos atributos: objetos que son atributos de otros objetos.
Existen independientemente de los objetos que los contienen.
9 Accedentes – para obtener atributos:
centro() y radio() en la clase Circulo 9 Objetos parámetros: reciben los argumentos de los métodos.
x() e y() en la clase Punto. Con objetos, parámetro y argumento se confunden.
Se manejan directamente los objetos que se pasan
9 Mutadores – para establecer los atributos: (paso por referencia).
centro(Punto) y radio(double) en la clase Circulo
x(double) e y(double) en la clase Punto. 9 Objetos locales: se crean en los métodos.
Existen durante la ejecución del método en cuestión
Sin embargo, veremos que hay clases en las que no procede incluir (una vez creados).
accedentes y/o mutadores.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 3 – POO en Java - 12 Curso de Java Tema 3 – POO en Java - 13
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Herencia Herencia

La herencia es un mecanismo fundamental de la POO que no se Cuando hacemos que una nueva clase sea subclase de otra,
encuentra en anteriores enfoques de programación. la nueva clase automáticamente adopta (hereda) los atributos
La herencia fomenta la reutilización. y los métodos que están definidos en la existente (superclase).
Así, ahora la clase Elipse también tiene definidos
Supongamos que necesitamos una clase para elipses.
dos atributos y cinco métodos.
Las elipses son básicamente círculos con otro radio más
Atributos: _centro y _radio
(por ejemplo, el radio mayor).
Métodos: centro(), radio(), centro(Punto),
Podemos entonces aprovechar la clase Circulo ya existente radio(double) y print()
y hacer que la nueva clase que necesitamos herede las
características (atributos y métodos) de aquella:
Dentro de la declaración propia de la subclase se describen las
public class Elipse extends Circulo { Circulo diferencias existentes respecto de la subclase:
... 9 Nuevas características (atributos/métodos).
Decimos que la clase Elipse 9 Redefinición de características heredadas.
Elipse
hereda (es subclase) de la clase Circulo.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 3 – POO en Java - 14 Curso de Java Tema 3 – POO en Java - 15
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Herencia Herencia

Nuevas características: public class Elipse extends Circulo {


double _radioMayor;
9 Nuevo atributo _radioMayor para el radio mayor de la elipse.
public double radioMayor() {
(El atributo _radio heredado se considera el radio menor.)
return _radioMayor;
9 Accedente y mutador para el nuevo atributo }
(radioMayor() y radioMayor(double)). public void radioMayor(double r) {
_radioMayor = r;
}
public void print() {
Redefinición de características: System.out.print("[");
_centro.print();
9 La información de las elipses no se muestra igual que la de los
System.out.print("," + _radio + ","
círculos, por lo que se debe redefinir el método print().
+ _radioMayor + "]");
}
}
Elipse.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 3 – POO en Java - 16 Curso de Java Tema 3 – POO en Java - 17
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Herencia Herencia

Características de la nueva clase Elipse (subclase de Circulo): Las relaciones de herencia entre clases se pueden representar en
forma de árbol (invertido), obteniéndose una representación gráfica
9 Atributos: de la jerarquía de clases:
_centro heredado
_radio heredado ObjetoGrafico
_radioMayor propio

9 Métodos: Punto Forma


centro() heredado
radio() heredado
radioMayor() propio
centro(Punto) heredado Linea Circulo Cuadrado
radio(double) heredado
radioMayor(double) propio
print() propio (redefine el heredado) Elipse Rectangulo

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 3 – POO en Java - 18 Curso de Java Tema 3 – POO en Java - 19
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Herencia y pasos de mensajes Polimorfismo y vinculación dinámica

La herencia modifica el mecanismo de paso de mensajes: Identificadores y objetos


Cuando a un objeto de una clase C se le pasa un mensaje M, Los objetos se manejan en los programas por medio
se busca primero un método M en la clase C. de identificadores:
Identificadores
1. Si existe un método M en la clase C, Circulo unCirculo; Punto unPunto;
se ejecuta ese método y termina el proceso. Cuando se establecen relaciones de herencia entre clases,
2. Si en la clase C no hay ningún método M, se sigue una regla de compatibilidad de objetos que dice que
se busca éste en la superclase de C.
un identificador declarado como de clase X
3. Si en la superclase de C existe un método M, puede hacer referencia a un objeto de la clase X
se ejecuta ese método y termina el proceso. o de cualquiera de sus subclases
4. Si en la superclase de C no hay ningún método M, Un Circulo puede ser un Circulo normal (sin dos radios)
se busca en las superclases de la superclase hasta que o una Elipse, pero una Elipse NO puede ser un Circulo
o bien se encuentra y se ejecuta normal (sin dos radios).
o no se encuentra en ninguna de las superclases, Esto puede resultar controvertido:
de forma que el objeto no entiende ese mensaje M. un círculo se puede considerar una elipse con los dos radios iguales.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 3 – POO en Java - 20 Curso de Java Tema 3 – POO en Java - 21
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Polimorfismo y vinculación dinámica Polimorfismo y vinculación dinámica

De acuerdo con lo anterior, lo siguiente es válido: public class Polimorfismo {


public static void main(String[] args) {
Circulo unCirculo; Punto unPunto = new Punto();
Elipse unaElipse; unPunto.x(2);
// ... unPunto.y(7);
unCirculo = unaElipse; Circulo unCirculo = new Circulo();
unCirculo.centro(unPunto);
La regla de compatibilidad de objetos nos lleva a otro mecanismo unCirculo.radio(1);
fundamental de la POO: el polimorfismo. Elipse unaElipse = new Elipse();
unaElipse.centro(unPunto);
El identificador c anterior puede hacer referencia a un objeto de la unaElipse.radio(3);
clase Circulo o a un objeto de la clase Elipse. unaElipse.radioMayor(4);
Circulo c;
El objeto al que haga referencia puede ser de dos formas distintas c = unCirculo; // Ahora es un Circulo
(de una de las dos clases) e incluso puede pasar de hacer c.print();
referencia a un objeto con una forma (de una clase) a hacer System.out.println();
c = unaElipse; // Y ahora una Elipse
referencia a un objeto con otra forma (de la otra clase). c.print();
Es polimórfico. System.out.println();
} Polimorfismo.java
}
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 3 – POO en Java - 22 Curso de Java Tema 3 – POO en Java - 23
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Polimorfismo y vinculación dinámica Relaciones entre clases

El polimorfismo nos lleva a otro mecanismo fundamental En los programas orientados a objetos se establecen dos tipos de
de la POO: la vinculación dinámica. relaciones entre las clases:
Circulo unCirculo; Elipse unaElipse;
9 Relación de herencia:
Circulo c; int opcion;
// ...
una clase es descendiente de otra clase.
if(opcion == 1) c = unCirculo; 9 Relación de clientelismo:
else c = unaElipse; una clase hace uso de otra clase.
c.print(); (Por ejemplo, porque declara algún atributo
¿Qué método print() se ejecutará? como objeto de la otra clase.)
¿El de la clase Circulo o el de la clase Elipse? Si en un programa se necesita una clase de una biblioteca,
No podemos saberlo hasta que se ejecute el programa. habrá que incluir esa clase junto con todas aquellas con las que
tenga establecidas relaciones de herencia y clientelismo.
El mensaje print() no se vincula con el método print()
correspondiente hasta que le llegue el momento de ejecutarse.
La vinculación entre mensajes y métodos se lleva a cabo
en tiempo de ejecución ⇒ vinculación dinámica.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 3 – POO en Java - 24 Curso de Java Tema 3 – POO en Java - 25
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

POO y reutilización POO y reutilización

Una de las características más relevantes de la POO es que fomenta La reutilización debe tenerse siempre presente durante la
la reutilización del software, reduciendo significativamente los programación orientada a objetos de un sistema.
costes del desarrollo de programas. Siempre que se pueda usar una clase existente, obviamente se
Las clases, por sí mismas, son módulos de programa reutilizables: preferirá reutilizar la clase antes que crear otra nueva.
Siempre que se necesite una determinada funcionalidad y ésta Siempre que haya que crear una nueva clase (por no existir ninguna
pueda ser proporcionada por una clase existente, se usará ésa. que resulte adecuada), se buscarán primero clases existentes que
Pero la POO lleva la reutilización a otro nivel: tengan bastantes similitudes con la que se ha de crear.
¿Qué pasa si se necesita una funcionalidad que ninguna clase Si se encuentra alguna con suficientes similitudes, se hará que
existente proporciona tal cual, pero que es parecida a la que la nueva clase sea subclase suya. De esta forma se aprovechan
proporciona alguna clase existente? (reutilizan) las características ya desarrolladas en la clase existente.
La herencia es la clave en este caso: se crea una nueva clase a ¿Cómo de similar debe ser la clase que se necesita
partir de esa cuya funcionalidad es parecida a la que se necesita. respecto de la clase ya existente?
De esta forma, se reutiliza todo lo que es adecuado de esa clase y Todas o casi todas las características deben ser adecuadas.
el desarrollo se centra únicamente en las diferencias. Se necesitarán algunas más y/o cambiar algunas pocas.
La experiencia aquí es la mejor ayuda.
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 3 – POO en Java - 26 Curso de Java Tema 3 – POO en Java - 27
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

You might also like