Este documento describe conceptos clave de programación orientada a objetos en Java como herencia, polimorfismo, clases abstractas e interfaces. Explica que la herencia permite que una clase herede atributos y métodos de otra clase, y que el polimorfismo permite invocar métodos de objetos de diferentes clases de la misma manera. También describe cómo las clases abstractas pueden contener métodos abstractos que deben implementarse en subclases, mientras que las interfaces definen métodos que deben implementarse.
1. Prof. Renny Batista Programación IIIOctubre, 2015
Programación Orientada a Objetos - Parte II
2. Herencia
¿Qué es la Herencia?
Es la capacidad de crear clases que adquieran de manera automática los
miembros (atributos y métodos) de otras clases que ya existen, pudiendo al
mismo tiempo añadir atributos y métodos propios.
Clase Padre
Superclase
Clase base
Clase Hija
Subclase
Clase derivada
4. Herencia
Ventajas de la Herencia
Reutilización de código: En aquellos casos dónde se necesite crear una clase que,
además de otros propios, deba incluir lo métodos definidos en otra, la herencia
evita tener que reescribir todos esos métodos en la nueva clase.
Mantenimiento de aplicaciones existentes: Usando la herencia, si tenemos una
clase con una determinada funcionalidad y tenemos la necesidad de ampliar dicha
funcionalidad, no necesitamos modificar la clase existente, sino que podemos
crear una clase que herede de la primera, adquiriendo toda su funcionalidad y
añadiendo sólo las nuevas.
Java proporciona gran cantidad de clases (bibliotecas) al programador, en el API
(Aplication Programming Interface) Java.
5. Herencia
Reglas de la herencia
En Java no esta permitida la herencia múltiple, es decir, una subclase no
puede heredar más de una clase.
Si es posible la herencia multinivel, es decir, “A” puede ser heredada por
“B” y “C” puede heredar “B”.
Una clase puede ser heredada por varias clases.
Por defecto, todas las clases derivan de java.lang.Object , a no ser que se
especifique otra clase padre.
6. Herencia
Reglas de la herencia
Clase A
Clase C
Clase B
Clase A
Clase CClase B
Clase A
Clase C
Clase B
7. Herencia
Constructores y Herencia
El constructor de una clase hija puede llamar al constructor de su clase padre
mediante el operador: super.
Como norma universal, cada vez que en Java se crea un objeto de una clase, antes
de ejecutarse el constructor de dicha clase se ejecutará primero el de su
superclase. public class Padre {
public Padre() {
System.out.println("Constructor de Padre");
}
}
public class Hija extends Padre{
public Hija() {
super();
System.out.println("Constructor de Hija");
}
}
Invoca al constructor de
la clase Padre
8. Clases finales
Si queremos evitar que una clase sea heredada por otra, deberá ser declarada
con el modificador final delante de superclase.
Si otra clase intenta heredar de una clase final se producirá un error de
compilación.
public final class ClaseA {
//Código de la clase
...
}
public class ClaseB extends ClaseA {
//Esta clase no compilará y va a generar un error
...
}
9. Sobrescritura de métodos
Cuando una clase hereda de otra, el comportamiento de los métodos que
hereda no siempre se ajusta a las necesidades de la nueva clase. En estos
casos, la subclase puede optar por volver a reescribir el método heredado, es
lo que se conoce como sobrescritura de un método.
Reglas a la hora de sobre escribir un método:
Cuando se sobrescribe un método de una subclase, éste debe tener el mismo
formato que el método de la superclase que sobrescribe.(igual nombre, iguales
parámetros e igual tipo de devolución).
El método sobrescrito puede tener un modificador menos restrictivo que el de la
superclase. Por ejemplo, el método de la superclase puede ser protected y la
versión sobrescrita en la subclase puede ser public, pero nunca uno mas
restrictivo.
10. Sobreescritura de métodos
public class ClaseA {
public void imprimirMesaje(String mensaje) {
System.out.println(mensaje);
}
}
public class ClaseB extends ClaseA{
public void imprimirMesaje(String mensaje) {
System.out.println(“El mensaje es: ”);
System.out.println(mensaje);
}
}
Método original
Método sobrescrito
11. Sobrescritra del método toString()
Aquí vamos a examinar el método toString(), porque es la manera de
obtener la representación en cadena de objetos de clases creadas por el
programador.
Todas las clases implementan el método toString( ) porque este método está
definido en la clase Object. Sin embargo, la implementación por omisión de
toString( ) raramente es suficiente.
Para la mayoría de las clases importantes creadas por el programador, será
deseable sobrescribir el método toString() y proporcionar nuestras propias
representaciones en forma de cadena.
Para implementar toString( ), basta simplemente con devolver un objeto
String que contenga la cadena legible que describa apropiadamente al objeto
de la clase.
12. Sobrescritra del método toString()
Ejemplo :
public class Caja {
double anchura;
double altura;
double profundidad;
public Caja(double w, double h, double d) {
anchura = w;
altura = h;
profundidad =d;
}
}
public class Ejemplo {
public static void main(String args[]){
Caja caja = new Caja(100, 50, 40);
System.out.println(caja);
}
}
paquete.Caja@139a55
13. Sobrescritra del método toString()
public class Caja {
double anchura;
double altura;
double profundidad;
public Caja(double w, double h, double d) {
anchura = w;
altura = h;
profundidad =d;
}
@Override
public String toString() {
return anchura+" "+altura+" "+profundidad;
}
} public class Ejemplo {
public static void main(String args[]){
Caja caja = new Caja(100, 50, 40);
System.out.println(caja);
}
}100.0 50.0 40.0
14. Clases abstractas
Es una clase en la que alguno de sus métodos está declarado pero no está
definido, es decir, se especifica su nombre, parámetros y tipo de devolución
pero no incluye código. A este tipo de métodos se les conoce como métodos
abstractos.
Un método se define como abstracto porque en ese momento no se conoce
como ha de ser su implementación; serán las subclases de la clase abstracta
las responsables de darle “cuerpo” mediante la sobrescritura del mismo.
15. Clases abstractas
Sintaxis para la creación de una clase abstracta:
public abstract class nombre_Clase {
public abstract tipo nombre_metodo(argumentos);
...
// otros métodos
}
16. Clases abstractas
Sobre la creación y utilización de clases abstractas hay que tener en cuenta
los siguientes aspectos:
Una clase abstracta puede tener métodos abstractos y no abstractos.
No es posible crear objetos de una clase abstracta, al haber métodos que no
estén definidos en la clase, no está permitido crear objetos de ella.
Las subclases de una clase abstracta están obligadas a sobrescribir todos los
métodos abstractos que heredan. En caso de que no interese sobrescribir
alguno de esos métodos, la subclase deberá ser declara también abstracta.
Una clase abstracta puede tener constructores.
17. Clases abstractas
Crear en Java las siguientes clases:
Clase Abstracta
Método abstracto
Implementa
el método
(sobrescribe)
18. Clases abstractas
//Figura.java
public abstract class Figura {
private String color;
public Figura(String color){
this.color=color;
}
public String obtenerColor(){
return color;
}
public abstract double area();
}
//Circulo.java
public class Circulo extends Figura{
private int radio;
public Circulo(int radio, String color){
super(color);
this.radio = radio;
}
public double area(){
return Math.PI*radio*radio;
}
public int obtenerRadio(){
return radio;
}
}
Implementa y sobrescribe el
método abstracto area()
(Polimorfismo)
19. Clases abstractas
//Triangulo.java
public class Triangulo extends Figura{
private int base;
private int altura;
public Triangulo(int base,int altura,String color){
super(color);
this.base = base;
this.altura = altura;
}
public double area(){
return (base*altura)/2;
}
public int obtenerBase(){
return base;
}
public int obtenerAltura(){
return altura;
}
}
20. Polimorfismo
Se define como la posibilidad de utilizar una misma expresión para invocar a
diferentes versiones de un mismo método. En Java, es posible asignar un
objeto de una clase a una variable de su superclase. Es aplicable, incluso,
cuando la superclase es una clase abstracta.
Ejemplo:
A partir de aquí, puede utilizarse está variable para invocar a aquellos métodos
del objeto que también estén definidos o declarados en la superclase, pero no a
aquellos que sólo existan en la clase a la que pertenece el objeto.
Figura objFig;
objFig = new Triangulo(5,7,”verde”);
objFig.obtenerColor(); //invoca al método de Triangulo
objFig.area(); //invoca al método área de Triangulo
objFig.obtenerBase(); //genera un error de compilación
objFig.obtenerAltura(); // genera un error de compilación
21. Polimorfismo
Java permite apuntar a un objeto con una variable definida como tipo de
clase padre.
En Java hay una clase que es la clase padre de todas las demás:
java.lang.Object. Un método de esta clase (por ejemplo: toString() que
convierte cualquier elemento de Java a cadena de caracteres), puede ser
utilizada por todos.
Figura objFig;
objFig = new Triangulo(5,7,”verde”);
Sólo se puede acceder a las partes del objeto que pertenecen a la clase Figura; las
partes específicas de la clase Triangulo no se ven. Este efecto se consigue porque,
para el compilador, objFig es sólo una variable de tipo Figura, no Triangulo.
22. Polimorfismo - Ejercicio
Una compañía paga a sus empleados en forma semanal. La compañía tiene 3 tipos de
empleados: empleados asalariados que reciben un sueldo semanal fijo, sin importar
el número de horas trabajadas; empleados por hora, que reciben un sueldo por hora
y pago por tiempo extra; empleados por comisión, que reciben un porcentaje de sus
ventas Para este período de pago, la compañía ha decidido compensar a los
empleados por comisión agregando un 10% a sus salarios.
La compañía desea implementar una aplicación en Java que realice sus cálculos de
nómina en forma polimórfica.
Utilizaremos la clase Empleado para representar a un empleado “genérico”. Las clases
que extienden a Empleado son EmpleadoAsalariado, EmpleadoPorComision y
EmpleadoPorHoras. Un método ingresos se aplica genéricamente a todos los
empleados. Pero el cálculo de los ingresos de cada empleado depende de su clase.
24. Es un conjunto de métodos abstractos y de constantes públicos definidos en un
archivo .java. Una interfaz es similar a una clase abstracta llevada al límite, en la
que todos sus métodos son abstractos.
La finalidad de una interfaz es la de definir el formato que deben de tener
determinados métodos que han de implementar ciertas clases.
Interfaz
Clase A Clase B Clase C
Interfaces
public void click(){
.
..
}
public void click(){
.
..
}
public void click(){
.
..
}
public void click();
25. Se representa con el símbolo de un clasificador (rectángulo), precediendo el
nombre con el estereotipo <<interface>>, o con una línea con un círculo en el
extremo, etiquetado con el nombre de la interfaz.
Una interfaz puede participar en relaciones de generalización, asociación y
dependencia establecidas en el diseño de los diagramas de clases.
Interfaces
Clase A
-Atributos
+Métodos()
Clase B
-Atributos
+Métodos()
Clase A
-Atributos
+Métodos()
Clase B
-Atributos
+Métodos()
<<Interface>>
Nombre_Interfaz
Nombre_Interfaz
<<uses>><<uses>>
26. Una interfaz se define mediante la palabra interface, utilizando la siguiente
sintaxis:
Ejemplo:
Interfaces
public interface Nombre_interfaz {
Tipo metodo1(argumentos);
Tipo metodo2(argumentos);
...
}
public interface Operaciones {
public void rotar();
public String serializar();
}
<<Interface>>
Operaciones
+rotar(): void
+serializar(): String
27. Por lo general, una interfaz se utiliza cuando clases dispares (es decir, no
relacionadas) necesitan compartir métodos y constantes comunes. Esto
permite que los objetos de clases no relacionadas se procesen en forma
polimórfica; los objetos de clases que implementan la misma interfaz pueden
responder a las mismas llamadas a métodos.
Interfaces
29. A la hora de crear una interfaz hay que tener en cuenta las siguientes
consideraciones:
Todos los métodos definidos en una interfaz son públicos y abstractos, aunque no
se indique explícitamente (abstract).
En una interfaz es posible definir constantes.
Ejemplo: public static final int valor_maximo = 100;
Una interfaz no es una clase. Las interfaces tan sólo pueden contener: métodos
abstractos y constantes. No pueden contener métodos con códigos,
constructores o variables, y por supuesto no es posible crear objetos de una
interfaz
Interfaces
30. Implementar una interfaz
En la definición de una clase, se utiliza la palabra implements para indicar
que interfaz se ha de implementar
Ejemplo:
public class Nombre_Clase implements Nombre_Interfaz {
//Código de la clase
...
}
public class Triangulo implements Operaciones {
public void rotar(){
//Código del método
...
}
public String serializar(){
//Código del método
...
}
}
31. Implementar una interfaz
A la hora de implementar una interfaz hay que tener en cuenta lo siguiente:
Cuando una clase implementa una interfaz, esta obligada a definir el código
(implementar) de todos los métodos existentes en la misma. De no ser así la clase
debe declararse como abstracta.
Una clase puede implementar más de una interfaz. En cuyo caso debe implementar
los métodos existentes en todas las interfaces.
public class NombreClase implements Interface1, Interface2,…{
}
Una clase puede heredar otra clase e implementar al mismo tiempo una o varias
interfaces
public class ClaseB extends ClaseA implements Interface1, Interface2{
}
Una interfaz puede heredar de otras interfaces.
public interface MiInterfaz extends Interface1, Interface2 {
}
32. Algunas Interfaces en java…
java.lang.Runnable. Contiene un método para ser implementado por aquellas
aplicaciones que van a funcionar en modo multitarea.
java.util.Enumeration. Proporciona métodos que son implementados por
objetos utilizados para recorrer colecciones.
java.awt.event.WindowListener. Proporciona métodos que deben ser
implementados por las clases que van a gestionar los eventos (clases
manejadoras) producidos en la ventana, dentro de una aplicación basada en
entorno gráfico.
java.sql.Connection. Interfaz implementada por los objetos utilizados para
manejar conexiones a bases de datos.
java.io.serializable. Esta interfaz requiere que el contenido de los objetos
tengan que ser trasferidos a algún dispositivo del almacenamiento, por
ejemplo un archivo de disco.
33. Bibliografía
Deitel, Paul J. Y Harvey M. Deitel. CÓMO PROGRAMAR EN JAVA. Séptima
edición PEARSON EDUCACIÓN, México 2008.
Martín, Antonio. PROGRAMADOR CERTIFICADO JAVA 2. CURSO PRÁCTICO.
Editorial RA-MA. 2da Edición.