Descarga la aplicación para disfrutar aún más
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)
Compartir