Вы находитесь на странице: 1из 19

La herencia en java

Java permite el empleo de la herencia , caracterstica muy potente que permite definir una clase tomando como base a otra clase ya existente. Esto es una de las bases de la reutilizacin de cdigo, en lugar de copiar y pegar.

En java, como ya vimos la herencia se especifica agregando la clasula extends despus del nombre de la clase. En la clasula extends indicaremos el nombre de la clase base de la cul queremos heredar.

Al heredar de una clase base, heredaremos tanto los atributos como los mtodos, mientras que los constructores son utilizados, pero no heredados.

Practicas:

Construyamos la clase Taxista.java con el siguiente cdigo:

public class Taxista extends Persona {

private int nLicencia;

public void setNLicencia(int num)

nLicencia = num;

public int getLicencia()

return nLicencia;

} Herencia en Java

La idea de la herencia es permitir la creacin de nuevas clases basadas en clases existentes. Cuando heredamos de una clase existente, reusamos (o heredamos) mtodos y campos, y agregamos nuevos campos y mtodos para cumplir con la situacin nueva. Cada vez que encontremos la relacin "es-un" entre dos clases, estamos ante la presencia de herencia.

La clase ya existente es llamada superclass, o clase base, o clase padre. La clase nueva es llamada subclase, clase derivada, o clase hija.

A travs de la herencia podemos agregar nuevos campos, y podemos agregar o sobre montar mtodos (override). Sobre montar un mtodo es redefinirlo en la case heredada.

Estudio de ejemplos: ManagerTest.java

Destacar uso de super para invocar al constructor de la clase base y para invocar a mtodos sobremontados.

Jerarqua de Herencia

Polimorfismo En Java una variable o nombre usado para referirse a un objeto de una clase X puede usarse para referirse a cualquier objeto de cualquier subclase de la clase X.

Por ejemplo: Si tenemos Employee e; e= new Employee(...); o e= new Manager(...); Esto tambin aplica a arreglos de Employee, cuyas entradas podran referirse a instancias de cualquier subclase de Employee. El inverso no es vlido. No se puede asignar una instancia de la superclase a un nombre para la subclase.

Esta es una forma de polimorfismo por que e puede referirse a un Employee o a un Manager.

Ligado Dinmico Es importante entender qu mtodo es aplicado al invocar uno a un objeto 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 parmetro. Si la superclase y la clase base tiene 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.

Casting

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(..); Usando e no podemos acceder a los mtodos slo presentes en Manager. Si queremos hacerlo, usamos: Manager m = (Manager) e; Ahora s podemos invocar todos los mtodos de Manager sobre m. Cmo sabemos que e aloja una instancia de Manager? Lo podemos preguntar con el operador instanceof. if (e instance of Manager) { m = (Manager) e; ..... }

Clases Abstractas (abstract classes) Llevando la idea de herencia a un extremo podemos pensar en buenas clases para representar un grupo 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. 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 Perros y gatos

Superclase Object Toda clase en Java hereda de la clase Object. sta no requiere ser indicada en forma explcita. Esto permite que podamos agrupar en forma genrica elementos de cualquier clase. En esta clase hay mtodos como equals() y toString() que en la mayora de loa casos conviene sobremontar. ver documentacin de clase Object.

Ver (alumnos) EqualsTest.java

Programacin Genrica (Generic Programming) Se le llama al hecho que podamos crear cdigo vlido para cualquier tipo de dato especfico. Por ejemplo en alguna clase podramos incorporar:

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

Ejemplo de Herencia en Java

Ac tenemos el ejemplo bsico de herencia en Java. En este caso la clase Ciudadano hereda desde la clase Persona, para tomar funcionalidad y extenderla. class Humano { protected String nombre; protected String apellido; public Humano(String nombre,String apellido) { this.nombre = nombre; this.apellido = apellido; } public String nombreCompleto() { return this.apellido + ", " + this.nombre; } public String identificacion() { return this.nombreCompleto(); } } class Ciudadano extends Humano { protected String documento; public Ciudadano(String nombre,String apellido, String documento) { super(nombre,apellido); this.documento = documento; } public String identificacion() { return super.identificacion() + ", documento: " + this.documento; } } public class Herencia { public static void main (String args[]) { Humano a = new Humano("Emilio","Rosso"); Ciudadano b = new Ciudadano("Emilio","Rosso","3052454545"); Humano [] arregloDeHumanos; arregloDeHumanos.push(a); arregloDeHumanos.push(b); identificarPolimorfico(arregloDeHumanos); } public static void identificarPolimorfico(Humano [] arregloDeHumanos) { for(int i = 0; i < arregloDeHumanos.length ; i++) { System.out.println("Identificando: " + arregloDeHumanos[i].identificacion()); } } }

En orientacin a objetos la herencia es el mecanismo fundamental para implementar la reutilizacin y extensibilidad del software. A travs de ella los diseadores pueden construir nuevas clases partiendo de una jerarqua de clases ya existente (comprobadas y verificadas) evitando con ello el rediseo, la remodificacin y verificacin de la parte ya implementada. La herencia facilita la creacin de objetos a partir de otros ya existentes, obteniendo caractersticas (mtodos y atributos) similares a los ya existentes. La herencia es uno de los mecanismos de la programacin orientada a objetos, por medio del cual una clase se deriva de otras, a la clase ya existente se le llama superclase, clase base o clase padre y a la nueva clase se le llama subclase, clase derivada o clase hija.

Jerarqua
Los descendientes de una clase heredan todas las variables y mtodos que sus ascendientes hayan especificado como heredables, adems de crear los suyos propios.

Ejemplo de rbol de herencia.

La caracterstica de herencia, nos permite definir nuevas clases derivadas de otra ya existente, que la especializan de alguna manera. As logramos definir una jerarqua de clases, que se puede mostrar mediante un rbol de herencia. En todo lenguaje orientado a objetos existe una jerarqua, mediante la que las clases se relacionan en trminos de herencia. En Java, el punto ms alto de la jerarqua es la clase Object de la cual derivan todas las dems clases (paquete java.lang).

Tipos de herencia
En java existen dos tipos de herencia, herencia simple y herencia mltiple.

Herencia simple
Un objeto puede extender las caractersticas de otro objeto y de ningn otro, es decir, que solo puede heredar o tomar atributos de un solo padre o de una sola clase.

Herencia mltiple
Un objeto puede extender las caractersticas de uno o ms objetos, es decir, puede tener varios padres.

Declaracin
Para indicar que una clase deriva de otra, heredando sus propiedades (mtodos y atributos), se usa el trmino extends, como en el siguiente ejemplo:

public class SubClase extends SuperClase { // Contenido de la clase }

Por ejemplo, creamos una clase MiPunto3D, hija de la clase ya mostrada MiPunto:

class MiPunto3D extends MiPunto { int z; MiPunto3D( ) { x = 0; // Heredado de MiPunto y = 0; // Heredado de MiPunto z = 0; // Nuevo atributo } }

La palabra clave extends se utiliza para decir que deseamos crear una subclase de la clase que es nombrada a continuacin, en nuestro caso MiPunto3D es hija de MiPunto.

Limitaciones de la herencia
Todos los campos y mtodos de una clase son siempre accesibles para el cdigo de la misma clase. Para controlar el acceso desde otras clases, y para controlar la herencia por las subclases, los miembros (atributos y mtodos) de las clases tienen tres modificadores posibles de control de acceso:

Public: Los miembros declarados public son accesibles en cualquier lugar en que sea accesible la clase, y son heredados por las subclases.

Private: Los miembros declarados private son accesibles slo en la propia clase.

Protected: Los miembros declarados protected son accesibles slo para sus subclases.

Por ejemplo
class Padre { // Hereda de Object // Atributos private int numeroFavorito;

private int nacidoHace; private int dineroDisponible; // Mtodos public int getApuesta() { return numeroFavorito; } protected int getEdad() { return nacidoHace; } private int getSaldo() { return dineroDisponible; } } class Hija extends Padre { // Definicin } class Visita { // Definicin }

En este ejemplo, un objeto de la clase Hija, hereda los tres atributos (numeroFavorito, nacidoHace y dineroDisponible) y los tres mtodos ( getApuesta(), getEdad() y getSaldo() ) de la clase Padre, y podr invocarlos. Cuando se llame al mtodo getEdad() de un objeto de la clase Hija, se devolver el valor de la variable de instancia nacidoHace de ese objeto, y no de uno de la clase Padre. Sin embargo, un objeto de la clase Hija, no podr invocar al mtodo getSaldo() de un objeto de la clase Padre, con lo que se evita que el Hijo conozca el estado de la cuenta corriente de un Padre. La clase Visita, solo podr acceder al mtodo getApuesta(), para averiguar el nmero favorito de un Padre, pero de ninguna manera podr conocer ni su saldo, ni su edad.

La clase object
La clase Object es la superclase de todas las clases da Java. Todas las clases derivan, directa o indirectamente de ella. Si al definir una nueva clase, no aparece la clusula extends, Java considera que dicha clase desciende directamente de Object.

Los mtodos pblicos y protegidos de esta clase son:

Public boolean equals(Object obj) compara si dos objetos son iguales, por defecto un objeto es igual solamente a si mismo.

Public int hashCode() devuelve (con alta probabilidad) un valor distinto para cada objeto.

Protected Object clone() throws CloneNotSuportedException devuelve una copia binaria del objeto (incluyendo sus referencias).

Public final Class getClass() devuelve el objeto del tipo Class que representa dicha clase durante la ejecucin.

Protected void finalize() throws Throwable se usa para finalizar el objeto, es decir, se avisa al administrador de la memoria que ya no se usa dicho objeto, y se puede ejecutar cdigo especial antes de que se libere la memoria.

Public String toString() devuelvo una cadena describiendo el objeto.

El polimorfismo
El polimorfismo es un concepto de la programacin orientada a objetos que nos permite programar en forma general, en lugar de hacerlo en forma especfica. En general nos sirve para programar objetos con caractersticas comunes y que todos estos compartan la misma superclase en una jerarqua de clases, como si todas fueran objetos de la superclase. Esto nos simplifica la programacin.

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

Para poner en prctica se har un ejemplo bastante sencillo. Se har una librera de clases que represente figuras tridimensionales y bidimensionales, y su respectiva jerarqua de clases. Las clases deben ser capaces de tener funcionamiento bastante bsico, como obtener reas, volmenes y permetros de la figura correspondiente.

La superclase de dicha jerarqua podra ser muy parecida a sta:

public abstract class figura { protected String nombre; protected int color; protected int grosorBorde; public String getNombre(){ return this.nombre; } public void setNombre(String n){ this.nombre=n; } public int getColor(){ return this.color; } public void setColor(int c){ this.color=c; } public int getGrosorBorde(){ return this.grosorBorde; } public void setGrosorBorde(int g){ this.grosorBorde=g; } public abstract void dibujar(); } //Las siguientes clases en el nivel de la jerarqua podran quedar muy parecidas a stas: public abstract class figura2D extends figura { public abstract int calcularArea(); public abstract int calcularPerimetro(); } public abstract class figura3D extends figura { public abstract int calcularVolumen(); }

Se le pide que forme las clases de la parte inferior de la jerarqua y que representaran los objetos a instanciarse. Adems, debe de realizar una implementacin de esta librera, en donde el usuario pueda crear nuevas figuras y que stas se almacenen en un arreglo de figuras.

Ligadura dinmica
La ligadura dinmica se encarga de ligar o relacionar la llamada a un mtodo con el cuerpo del mtodo que se ejecuta finalmente.

Existen dos tipos de ligadura: esttica y dinmica.

Ligadura esttica:

Consiste en realizar el proceso de ligadura en tiempo de compilacin segn el tipo declarado del objeto al que se manda el mensaje.

La utilizan (en Java) los mtodos de clase y los mtodos de instancia que son privados o final (ya que estos ltimos no pueden ser sobrescritos).

Ligadura dinmica:

Consiste en realizar el proceso de ligadura en tiempo de ejecucin siendo la forma dinmica del objeto la que determina la versin del mtodo a ejecutar.

Se utiliza en todos los mtodos de instancia de Java que no son privados ni final.

Funcionamiento de la ligadura dinmica


Resolucin de conflictos entre Superclases y Subclases:

Cuando existe un conflicto entre un mtodo de una superclase y un mtodo de la subclase, el comportamiento correcto es que el mtodo de la subclase sobrescriba al de la superclase.

Si estamos llamando a un mtodo de la subclase desde una variable que ha sido declarada del tipo de la superclase. Cmo se consigue que funcione correctamente?

Ligadura Dinmica:

Significa que la forma dinmica del objeto determina la versin de la operacin que se aplicar.

Esta capacidad de las operaciones para adaptarse automticamente a los objetos a los cuales se aplican es una de las propiedades ms importantes de la orientacin a objetos.

Caractersticas de la Ligadura Dinmica


Puede variar de un lenguaje a otro, pero bsicamente presentan unas caractersticas comunes. Los mtodos que necesitan ligadura dinmica:

Deben presentar ligadura dinmica solo aquellos que pueden ser redefinidos.

Por ejemplo, en Java, los mtodos de clase y los mtodos de instancia privados y/o finales no presentan ligadura dinmica.

En Java, si no se especifica nada se entender que el mtodo puede ser redefinido y por tanto debe presentar ligadura dinmica.

Вам также может понравиться