Logo Studenta

Herencia, polimorfismo e interfaces

¡Este material tiene más páginas!

Vista previa del material en texto

1
Ing. Marcelo Parisholon sw
11 Herencia, Polimorfismo e 
Interfaces
2
Ing. Marcelo Parisholon sw
Objetivos
Al finalizar la lección, el estudiante podrá:
● Definir super clases y subclases
● Sobreescribir métodos de la superclase.
● Crear métodos y clases “final”.
3
Ing. Marcelo Parisholon sw
Herencia
● En Java, todas las clases, inclusive las clases que 
confirman el API de Java, son subclases de la superclase 
Object. 
● Un ejemplo de jerarquia de clase es la siguiente:
● Superclase
– Cualquier clase sobre una clase específica en la jerarquia de 
clases.
● Subclase
– Cualquier clases debajo de una clase especifica en la jerarquia de 
clases.
4
Ing. Marcelo Parisholon sw
Herencia
● Beneficios de la herencia en la POO: Reusabilidad
– Un comportamiento (metodo) es definido en la superclase, este 
comportamiento será automáticamente heredado por todas las 
subclases. 
– Así, podemos codificar el método una vez y será utilizado por todas 
las subclases. 
– Una subclase solo necesita implementar las diferencias entre si 
misma y su padre ( superclase).
5
Ing. Marcelo Parisholon sw
Herencia
● Para derivar una clase, utilizamos la palabra reservada 
extends. 
● Para ilustrarlo, crearemos una clase ejemplo de clase 
padre.
● Supongamos que tenermos la clase padre denominada 
Persona. 
public class Persona { 
protected String nombre; 
protected String direccion; 
/**
 * Default constructor 
 */ 
public Persona(){ 
System.out.println(“Dentro de Persona:Constructor”); 
nombre = ""; direccion = ""; 
}
. . . .
} 
6
Ing. Marcelo Parisholon sw
Herencia
● Ahora, queremos crear otra clase denominada Estudiante. 
● Como un estudiante es también una persona, decidimos 
extender la clase Persona, de modo que podamos heredar 
todoas las propiedades y metodos definidos en la clase 
Persona. 
● Para realizar esto, escribimos, 
public class Estudiante extends Persona {
 public Estudiante(){ 
System.out.println(“Dentro de Estudiante:Constructor”); 
}
 . . . .
}
7
Ing. Marcelo Parisholon sw
Herencia
● Cuando un objeto Estudiante es instanciado, el constructor 
de su superclase es invocado implicitamente para realizar 
las inicializaciones necesarias.
● Luego de esto, las intrucciones dentro del constructor de la 
subclase serán ejecutadas.
8
Ing. Marcelo Parisholon sw
Herencia:
● Para ilustrar esto, consideremos el siguiente codigo, 
● En el codigo, creamos un objeto de la clase Estudiante. La 
salidad del programa es, 
public static void main( String[] args ){ 
Estudiante anna = new Estudiante (); 
} 
Dentro de Persona:Constructor 
Dentro de Estudiante:Constructor
9
Ing. Marcelo Parisholon sw
Herencia
● El flujo del programa es el siguiente,
10
Ing. Marcelo Parisholon sw
La palabra reservada “super”
● Una subclase puede explicitamente invocar el constructor 
de la superclase inmediata. 
● Esto es realizado por el uso de la llamada del constructor 
super. 
● Una llamada al constructor super en el constructor de una 
subclase dará por resultado la ejecución de un constructor 
relevante de la superclase dependiendo de los parametros 
invocados como argumentos. 
11
Ing. Marcelo Parisholon sw
La palabra reservada “super”
● Por ejemplo, dadas las clases de nuestro ejemplo previo, 
las clases Persona y Estudiante, mostramos un ejemplo de 
invocacion de un constructor super. 
● Dado el siguiente codigo para la clase Estudiante, 
public Estudiante (){ 
super( “Algun Nombre", “Alguna direccion" );
 System.out.println(“Dentro de Estudiante::Constructor");
} 
12
Ing. Marcelo Parisholon sw
La palabra reservada “super”
● Algunas cosas para recordar cuando utilizamos llamadas a 
constructores super:
– La invocacion super() DEBE SER LA PRIMER SENTENCIA 
DENTRO DE UN CONSTRUCTOR. 
– La invocación super() puede ser utilizada solamente en la 
implementación de un contructor. 
– Esto implica que las invocaciones de constructores this() y super() 
NO PUEDEN APARECER AMBAS EN UN MISMO 
CONSTRUCTOR
13
Ing. Marcelo Parisholon sw
La palabra reservada “super”
● Tambien se utiliza super para hacer referencia a miembros 
de la superclase (de manera semejante que la referencia 
this). 
● Por ejemplo, 
public Estudiante() { 
super.nombre = “AlgunNombre”; 
super.direccion = “AlgunaDireccion”; 
} 
14
Ing. Marcelo Parisholon sw
Sobreescirtura de metodos
● Si por alguna razón la clase derivada necesita tener una 
implementacion diferente de cierto método de la superclase, 
la sobreescritura de métodos son muy útiles. 
● Una subclase puede sobreescribir un metodo definido en su 
superclase a traves de proveer una nueva implementación 
de dicho metodo.
15
Ing. Marcelo Parisholon sw
Ejemplo
● Supongamos que tenemos la siguiente implementación 
para el método getNombre en la superclase Persona, 
public class Persona { 
: 
: 
public String getNombre (){ 
System.out.println(“Persona: getNombre"); 
return nombre; 
} 
}
16
Ing. Marcelo Parisholon sw
Ejemplo
● Para sobreescribir, el metodo getNombre de la superclase 
Persona, escribimos en la subclase Estudiante,
● Ahora, cuando invocamos el metodo getNombre de un 
objeto de la subclase Estudiante, el método sobreescrito 
getNombre será invocado y la salida será,
public class Estudinate extends Persona{
: 
: 
public String getNombre(){ 
System.out.println(“Estudiante: getNombre"); 
return name; 
} 
: 
} 
Estudiante: getNombre 
17
Ing. Marcelo Parisholon sw
Clases Finales
● Clases Finales
– Son clases que no pueden ser extendidas
– Para declarar una clase como final, escribimos,
public final ClassName{
. . . 
}
● Ejemplo:
● Otros ejemplo de clases finales son las clases wrappers y 
Strings.
public final class Person { 
. . . 
} 
18
Ing. Marcelo Parisholon sw
Metodos y Clases Finales
● Metodos Finales
– Son metodos que no pueden ser sobreescritos
– Para declarar metodos finales escribimos,
public final [returnType] [methodName]([parameters]){
. . .
}
● Los métodos Estáticos son automáticamente finales
19
Ing. Marcelo Parisholon sw
Ejemplo
public final String getNombre(){
 return nombre; 
} 
20
Ing. Marcelo Parisholon sw
Polimorfismo
● Polimorfismo
– Es la habilidad de una variable de referencia de cambiar su 
comportamiento acorde al objeto que esta conteniendo.
– Esto permite que multiples objetos de diferentes subclases sean 
tratados como un simple objeto de la superclase, mientras 
automáticamente selecciona el metodo apropiado a aplicar a un 
objeto en particular basado en la subclase a la que pertenece. 
● Para ilustrar el polimorfismo, lo discutiremos con un 
ejemplo.
21
Ing. Marcelo Parisholon sw
Polimorfismo
● Dada la clase padre Persona y la subclase Estudiantede 
los ejemplos previos, agregaremos otra subclase de 
Persona que llamaremos Empleado. 
● El siguiente grafico es la jerarquia de clases del ejemplo. 
22
Ing. Marcelo Parisholon sw
Polimorfismo
● En Java, podemos crear una referencia que es el tipo de la 
superclase para un objeto de sus subclases. Por ejemplo, 
public static main( String[] args ) {
 
Persona ref; 
Estudiante unEstudiante = new Estudiante (); 
Empleado unEmpleado = new Empleado (); 
ref = unEstudiante; //una referencia Persona que 
 // apunta a un objeto Estudiante
}
23
Ing. Marcelo Parisholon sw
Polimorfismo
● Ahora supongamos que tenemos un metodo getNombre en 
nuestra superclase Persona, y sobreescribimos este 
metodo en ambas subclases Estudiante y Empleado.
public class Estudiante { 
public String getNombre(){ 
System.out.println(“Nombre Estudiante:” + nombre); 
return nombre; 
}
} 
public class Empleado { 
public String getNombre(){ 
System.out.println(“Nombre Empleado:” + nombre); 
return nombre; 
} 
} 
24
Ing. Marcelo Parisholon sw
Polimorfismo
● Regresando a nuestro metodo main, cuando intentamos 
invocar el metodo getNombre de la referencia Personal ref, 
el metodo getNombre del objeto Estudiante será invocado. 
● Ahora, si asignamos ref a un objeto Empleado, el metodo 
getNombre de Empleadoserá invocado. 
25
Ing. Marcelo Parisholon sw
Polimorfismo
1 public static main( String[] args ) {
2 Persona ref; 
3 Estudiante unEstudiante = new Estudiante (); 
4 Empleado unEmpleado = new Empleado(); 
6 ref = unEstudiante; //Persona ref apunta a
7 // objeto Estudiante
9 //getNombre de Estudiante es invocado
10 String temp=ref.getNombre();
11 System.out.println( temp ); 
13 ref = unEmpleado; //Persona ref. Apunta a un
14 // objeto Empleado 
15
16 //getNombre de Empleado es invocado
17 String temp = ref.getNombre();
18 System.out.println( temp ); 
19 } 
26
Ing. Marcelo Parisholon sw
Polimorfismo
● Otro ejemplo que ilustra el polimorfismo es cuando 
intentamos pasar referencias a los metodos.
● Supongamos que tenemos un metodo estatico 
printInformacion que toma una referencia a una Persona 
como parametro. 
public static printInformacion( Persona p ){
. . . .
}
27
Ing. Marcelo Parisholon sw
Polimorfismo
● Podemos pasar referencias del tipo Empleado y 
Estudiante al metodo printInformacion mientras sean 
subclases de la clase Persona.
public static main( String[] args )
{
Estudiante unEstudiante = new Estudiante();
Empleado unEmpleado = new Empleado();
printInformacion( unEstudiante );
printInformacion( unEmpleado );
}
28
Ing. Marcelo Parisholon sw
Clases Abstractas
● Clas Abstracta
– Es una clase que no puede ser instanciada. 
– Siempre aparecen en la parte superior de la jerarquia de clases de 
la programacion orientada a objetos, definiendo tipos genericos de 
acciones posibles con todos las subclases de la clase.
29
Ing. Marcelo Parisholon sw
Clases Abstractas
● Metodos abstractos
– Metodos en clases abstractas que no tienen implementacion.
– Para crear un metodo abstracto, solo escribimos la declaracion del 
metodo sin el cuerpo y utilizamos la palabra reservada abstract 
● Por ejemplo, 
public abstract void someMethod();
30
Ing. Marcelo Parisholon sw
Ejemplo de Clase Abstracta
public abstract class CosaViviente { 
public void respirar(){ 
System.out.println(“Cosa viviente respirando..."); 
} 
public void comer (){ 
System.out.println(“Cosa viviente comiendo..."); 
} 
/** 
 * abstract method caminar 
 * Queremos que las subclases
 * escriban el metodo
 */ 
public abstract void caminar(); 
} 
31
Ing. Marcelo Parisholon sw
Clases Abstractas
● Cuando extendemos la clase abstracta CosaViviente, es 
requerido la sobreescritura del metodo abstracto caminar(), 
o sino, esta clase se volverá también abstracta, y no podra 
ser instanciada. 
● Por ejemplo, 
public class Humano extends CosaViviente {
public void caminar(){ 
System.out.println("Humano caminando..."); 
} 
} 
32
Ing. Marcelo Parisholon sw
Guía de Codificación
● Utilice clases abstractas para definir tipos de 
comportamientos amplios en la parte superior de la 
jerarquia de clases, y utilice sus subclases para proveer los 
detalles de la implementacion de la clase abstracta. 
33
Ing. Marcelo Parisholon sw
Interfaces
34
Ing. Marcelo Parisholon sw
Interfaces
● Una Interface
– Es un tipo especial de bloque conteniendo declaraciones de 
metodos ( y constantes posibles) solamente. 
– Define la firma(o encabezado de declaracion) de un conjunto de 
metodos, sin el cuerpo. 
– Declara de una manera standard y publica el comportamiento de 
las clases. 
– Permite a las clases, independiente de su ubicación dentro de la 
jerarquia de clases, implementar comportamientos comunes. 
– NOTA: Las interfaces muestran también polimorfismo, desde el 
programa es posible invocar un metodo de la interface, y la version 
propia del metodo será invocada dependiendo del tipo de objeto 
pasado a la interface del metodo invocado.. 
35
Ing. Marcelo Parisholon sw
Porque utilizamos Interfaces?
● Para tener clases sin relacion con metodos con 
implementaciones similares
– Ejemplo:
● Las clases Line y MyInteger
– No estan relacionadas
– Ambas implementan los metodos de 
comparacion
● isGreater
● isLess
● isEqual
36
Ing. Marcelo Parisholon sw
Porque utilizamos interfaces?
● Para revelar la interface de programacion del objeto sin 
revelar la clase.
● Para modelar la herencia multiple que permite a una 
clase tener mas de una superclase
37
Ing. Marcelo Parisholon sw
Interfaces vs. Clases Abstractas
● Metodos de Interface no tienen cuerpo
● Una interface solo puede tener constantes
● Las interfaces no tienen relaciones de herencia con una 
clase en particular, son definidas independientemente
38
Ing. Marcelo Parisholon sw
Interface vs. Clases
● Comun:
– Las interfaces y Clases son Tipos
– Esto significa que una interface puede ser utilizada en cualquier 
lugar donde la clase puede ser utilizada.
– Por ejemplo:
PersonInterface pi = new Person();
Person pc = new Person();
● Diferencias:
– No es posible instanciar una interface
– Por ejemplo:
PersonInterface pi = new PersonInterface(); //ERROR!
39
Ing. Marcelo Parisholon sw
Interface vs. Clase
● Comun:
– Interface y Clases pueden definir metodos
● Diferencia:
– Una Interface no tiene ninguna implementacion de los metodos
40
Ing. Marcelo Parisholon sw
Creando Interfaces
● Para crear una interface, escribimos:
public interface [nombre_interface] {
 //algunos metodos sin cuerpo
}
41
Ing. Marcelo Parisholon sw
Creando Interfaces
● Como ejemplo, crearemos una interface que define las 
relaciones entre dos objetos acorde al “orden natural” de los 
objetos.
public interface Relation
{
public boolean isGreater( Object a, Object b);
public boolean isLess( Object a, Object b);
public boolean isEqual( Object a, Object b);
}
42
Ing. Marcelo Parisholon sw
● Para utilizar una interface, utilizamos la palabra reservada 
implements.
● Por ejemplo,
/**
 * This class defines a line segment
 */
public class Line implements Relation {
private double x1;
private double x2;
private double y1;
private double y2;
public Line(double x1, double x2, double y1, double y2){
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
}
Creando Interfaces
43
Ing. Marcelo Parisholon sw
public double getLength(){
double length = Math.sqrt((x2-x1)*(x2-x1) + 
(y2-y1)* (y2-y1));
return length;
}
public boolean isGreater( Object a, Object b){
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen > bLen);
}
public boolean isLess( Object a, Object b){
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen < bLen);
}
public boolean isEqual( Object a, Object b){
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen == bLen);
}
}
Creando Interfaces
44
Ing. Marcelo Parisholon sw
● Cuando su clase intenta implementar una interface, siempre 
asegurece que ha implementado todos los metodos 
declarados en la interface, o si no, encontrara el siguiente 
error de compilacion,
Line.java:4: Line is not abstract and does not override 
abstract method 
isGreater(java.lang.Object,java.lang.Object) in Relation
public class Line implements Relation
 ^
1 error
Creando Interfaces
45
Ing. Marcelo Parisholon sw
Relaciones Interface - Clase
● Una clase puede extender solo UNA SUPERCLASE, pero 
puede implementar VARIAS INTERFACES.
● Por Ejemplo:
public class Persona implements PersonaInterface, 
CosaViviente, 
OtrasInterfaces {
//some code here
}
46
Ing. Marcelo Parisholon sw
● Otro ejemplo:
public class EstudianteLicenciatura 
extends Estudiante
implements PersonaInterface,
 CosaViviente {
//some code here
}
Relaciones Interface - Clase
47
Ing. Marcelo Parisholon sw
Herecia e interfaces
● Las Interfaces no son parte de la jerarquia de clases. Sin 
embargo, las interfaces pueden tener relaciones de 
herencia entre ellas mismas
● Por ejemplo:
public interface PersonaInterface {
. . .
}
public interface EstudianteInterface 
extends PersonaInterface {
. . .
}
48
Ing. Marcelo Parisholon sw
Resumen
● Herencia (superclase, subclase)
● Utilizando palabra reservada super para acceder a campos 
y constructoresde la superclase
● Sobreescribiendo Metodos
● Clases y Metodos Finales
● Polimorfismo (Clase Abstracta, Interfaces)

Otros materiales