03 java poo_parte_2
-
Upload
renny-batista -
Category
Education
-
view
616 -
download
0
Transcript of 03 java poo_parte_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
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.
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.