Vous êtes sur la page 1sur 19

Herencia en Java

Agustn J. Gonzlez Diseo y Programacin Orientados a Objetos

Introduccin

La idea bsica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos re-usando cdigo (mtodos y campos). Podemos agregar mtodos y variables para adaptar la clase a la nueva situacin. Java tambin permite consultar por la estructura de una clase (cules son sus mtodos y variables). A esto se le llama reflexin.

Introduccin (cont.)

La herencia la identificamos cuando encontramos la relacin es-un entre la nueva clase y la ya existente. Un estudiante es una persona. La clase ya existente se le llama superclase, clase base , o clase padre. A la nueva clase se le llama subclase, clase derivada, o clase hija.

Redefinicin de mtodos

En la clase derivada podemos redefinir (override) mtodos, lo cual corresponde a reimplementar un mtodo de la clase base en la clase derivada. Si an deseamos acceder la mtodo de la clase base, lo podemos hacer utilizando la palabra super como referencia al padre. Notar que tambin usamos esta palabra reservada para invocar constructores de la clase base.
4

Ejemplo: Los gerentes tambin son empleados

Supongamos que los gerentes reciben bonos por su desempeo. Luego su salario ser aquel en su calidad de empleado ms los bonos que le correspondan. Ver ManagerTest.java Jerarqua de clases:

Polimorfismo

Hay varias formas de polimorfismo:

Cuando invocamos el mismo nombre de mtodo sobre instancias de distinta clase cuando creamos mltiples constructores cuando va subtipo asignamos una instancia de una subclase a una referencia a la clase base.

Cuando creamos una clase derivada, gracias a la relacin es-un podemos utilizar instancias de la clase derivada donde se esperaba una instancia de la clase base. Tambin se conoce como principio de subtitucin.
6

Polimorfismo: Ejemplo
Sea: class Employee { ..... } class Manager extends Employee { .... } Employee e; e=new Employee(...); // instancia, caso a e=new Manager(..); // OK. Subtitucin, caso b En el caso a a travs de e tenemos acceso a todo lo correspondiente a un Employee. En el caso b tenemos acceso a todo lo correspondiente a Employee, pero con la implementacin de Manager. Al revs no es vlido porque toda referencia a Manager debe disponer de todos los campos.

Polimorfismo: Ejemplo

Sea: class Employee { ..... } class Manager extends Employee { .... } Employee e; e=new Employee(...); // instancia, caso a e=new Manager(..); // OK. Subtitucin, caso b Employee e
Slo tenemos acceso a atributos de Employee, pero con la implementacin de Manager

Employee

Employee Employee
e
Name Salary hireDay

Name Salary hireDay bonus

Manager
8

Ligado Dinmico

Es importante entender qu mtodo es usado al invocar a un nombre que se puede referir a instancias de distinta clase. Al momento de la compilacin el compilador intenta resolver el mtodo que corresponde segn su nombre y parmetros. Si la superclase y la clase base tienen definido el mismo mtodo Cul se llama?. Si el mtodo en la clase declarada para la variable no es privado, static, o final, se invocar en forma dinmica. Esto es, se invocar el mtodo definido segn el objeto referenciado por el nombre y no segn la declaracin del nombre. Por ello, si una clase derivada redefine el mismo mtodo, ste ser invocado para sus instancias. El ligado dinmico se resuelve a tiempo de ejecucin.
9

Ligado Dinmico (cont.)

Gracias el Ligado dinmico es posible hacer programas fcilmente extensibles. Creamos una clase derivada y redefinimos los comportamientos que deseamos. No se requiere recompilar las clases existentes. Esto es usado intensamente cuando usamos clases predefinidas en el lenguaje. Si deseamos impedir que una de nuestras clases se use como base, la declaramos como final. Final class Manager extends Employee { ... } Si un mtodo es final, ninguna subclase puede redefinirlo. El ligado dinmico es ms lento que el esttico.

10

Casteo: Cambio de tipo forzado

Cmo podemos acceder a los mtodos definido en una clase derivada pero no en la base? Se debe hacer un cambio de tipo forzado. Por ejemplo:

Employee e= new Manager(..); Con e no podemos acceder a los mtodos presentes slo en Manager. Si queremos hacerlo, usamos: Manager m = (Manager) e; Con m s podemos invocar los mtodos de Manager.

11

Casteo: Cambio de tipo forzado (cont.)

Cmo sabemos que e es una referencia a una instancia de Manger? Lo podemos preguntar con el operador instance of.
if (e instance of Manager) { m = (Manager) e; ..... }

12

Clases abstractas

Llevando la idea de herencia a un extremo, podemos pensar en buenas clases para representar un grupo de objetos pero que no tienen instancias propias.

Por ejemplo Forma como clase base de Triangulo, Circulo, Cuadrado.

Forma puede indicar todo el comportamiento vlido para una forma pero no puede instanciarse por si mismo.

13

Clases abstractas (cont.)

En ente caso Forma debe declararse como clase abstracta por tener al menos un mtodo declarado pero no implementado.
public abstract class Forma { ... public abstract double area(); .. }

ver PersonTest.java ver Gatos y perros


14

Clase Object: Nivel mximo de la jerarqua de clases

Toda clase en Java hereda en su jerarqua mxima de la clase Object. sta no requiere ser indicada en forma explcita. Esto permite que podamos agrupar en forma genrica elementos de cualquier clase, por ejemplo en un arreglo de Object. En esta clase hay mtodos como equals() y toString() que en la mayora de los casos conviene redefinir. ver documentacin de clase Object. Ver: EqualsTest.java
15

Programacin genrica/diseo de patrones

Las facilidades que ofrece el diseo orientado a objetos y la programacin orientada a objetos permiten ofrecer soluciones a casos genricos. La idea es poder crear cdigo til para cualquier clase especfica. Por ejemplo podemos definir una clase con mtodos utilitarios como:
static int find (Object [ ] a , Object key) { int i; for (i=0; i < a.length; i++) if (a[i].equals(key) return i; // encontrado return -1; // no exitoso }

16

ArrayList: como Ejemplo de programacin genrica

Hay muchas estructuras de datos que no quisiramos programar cada vez, ejemplo: stack, hash, lista, etc. El ArrayList permite crear arreglos de tamao variable. Lo malo es que el acceso no es con [ ]. Ver esta clase en documentacin

17

La clase Class

La mquina virtual Java mantiene informacin sobre la estructura de cada clase. sta puede ser consultada en tiempo de ejecucin.
Employee e = new Employee(...); ... Class cl=e.getClass();

La instancia de Class nos sirve para consultar datos sobre la clase, por ejemplo su nombre.
System.out.println(e.getClass().getName()+ +e.getName()); // genera por ejemplo: Employee Harry Hacker
18

La clase Class (cont.)

Ver la clase Class. Nos permite obtener toda la informacin de una clase, su clase base, sus constructores, sus campos datos, mtodos, etc. Por ejemplo ver ReflectionTest.java Esta funcionalidad normalmente es requerida por constructores de herramientas ms que por desarrolladores de aplicaciones.

19

Vous aimerez peut-être aussi