03 java poo_parte_2

33
Prof. Renny Batista Programación III Octubre, 2015 Programación Orientada a Objetos - Parte II

Transcript of 03 java poo_parte_2

Prof. Renny Batista Programación III Octubre, 2015

Programación Orientada a Objetos - Parte II

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

Herencia

Representación UML

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.

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.

Herencia

Reglas de la herencia

Clase A

Clase C

Clase B

Clase A

Clase C Clase B

Clase A

Clase C

Clase B

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

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 . . . }

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.

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

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.

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

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

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.

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

}

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.

Clases abstractas

Crear en Java las siguientes clases:

Clase Abstracta

Método abstracto

Implementa el método

(sobrescribe)

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)

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; }

}

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

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.

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.

Polimorfismo - Ejercicio

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();

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>>

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

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

Interfaces class interfaces

Empleado

- apellido: String

- cedula: String

- nombre: String

+ Empleado(String, String, String)

+ getApellido(): String

+ getCedula(): String

+ getNombre(): String

+ setApellido(String): void

+ setCedula(String): void

+ setNombre(String): void

+ toString(): String

EmpleadoAsalariado

- salarioSemanal: double

+ EmpleadoAsalariado(String, String, String, double)

+ getSalarioSemanal(): double

+ obtenerMontoPago(): double

+ setSalarioSemanal(double): void

+ toString(): String

Factura

- cantidad: int

- codigo: String

- descripcion: String

- precio: double

+ Factura(String, String, int, double)

+ getCantidad(): int

+ getCodigo(): String

+ getDescripcion(): String

+ getPrecio(): double

+ obtenerMontoPago(): double

+ setCantidad(int): void

+ setCodigo(String): void

+ setDescripcion(String): void

+ setPrecio(double): void

+ toString(): String

«interface»

PorPagar

+ obtenerMontoPago(): double

Principal

+ main(String[]): void

Método abstracto

Implementación (sobrescribe)

Implementación en la clase que hereda

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

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 . . .

}

}

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 {

}

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.

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.