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

1

Clase 27 Herencia y polimorfismo Herencia


La herencia es el proceso mediante el cual un objeto adquiere las propiedades de otro. Mediante el uso de la herencia, un objeto solo necesita definir las cualidades que lo diferencian de otro del cual hereda sus propiedades. En ocasiones, necesitamos una relacin entre clases algo ms estrecha. Una relacin del tipo "es un". Por ejemplo, sabemos bien que un gato es un mamfero. Sin embargo es tambin un concepto ms especfico, lo que significa que una clase Gato puede compartir con Mamifero propiedades y mtodos, pero tambin puede tener algunas propias.

Ejemplo 1:
Mostrar a travs de una aplicacin sencilla, la forma como se crea un clase Mamiero y de ella una subclase llamada Gato. El objetivo del programa es ver la forma como los atributos protegidos y los mtodos pblicos de la superclase pueden ser utilizados en la subclase. Negro El Gato es el que se mueve

Aplicacion.java
public class Aplicacion { public static void main ( String [ ] args ) { Gato miGato; miGato = new Gato ( ); miGato.setNumeroPatas ( 4 ); miGato.setColor ( "Negro" ); System.out.println ( miGato.getColor ( ) ); miGato.mover ( ); } } // Fin de la clase Aplicacion

Mamifero.java
public class Mamifero { protected String especie; protected String color; public void setColor ( String nuevoColor ) { color = nuevoColor; }

2 public String getColor ( ) { return color; } public void setEspecie ( String nuevaEspecie ) { especie = nuevaEspecie; } public String getEspecie ( ) { return especie; } public void mover ( ) { System.out.println ( "El Mamifero se mueve" ); } } // Fin de la clase Mamifero

Gato.java
public class Gato extends Mamifero { private int numeroPatas; public void setNumeroPatas ( int valor ) { numeroPatas = valor; } public int getNumeroPatas ( ) { return numeroPatas; } public void mover ( ) { System.out.println ( "El Gato es el que se mueve" ); } } //Fin de la clase Gato Como se puede ver en el ejemplo, el objeto miGato no slo tiene la propiedad numeroPatas, tambin tiene las propiedades color y especie que son propiedad de la clase Mamifero. Se dice que Mamifero es la superclase y Gato la subclase en una relacin de herencia. Esta relacin se consigue en Java por medio de la palabra reservada extends. Adems de heredar la funcionalidad de la superclase, una clase hija puede sobreescribir algn mtodo con el fin de especializar su funcionamiento. Podemos escribir un mtodo en la subclase que tenga el mismo nombre y los mismos parmetros que un mtodo de la superclase, como es el caso del mtodo mover. Al ejecutar el programa se puede ver que el mtodo que se ejecuta es el de la subclase y no el de la superclase, aunque tengan el mismo nombre. Conviene indicar que Java es un lenguaje en el que todas las clases conforman una jerarqua de clases, an cuando no se indique explcitamente. En la jerarqua de Java todas las clases heredan de la clase Object. Esto permite que todas las

3 clases tengan algunas cosas en comn, lo que permite que funcione, entre otras cosas, el recolector de basura.

Ejemplo 2
Mostrar la forma como se puede especializar una clase llamada SuperClase utilizando la herencia de Java. En este caso, la subclase tiene un atributo adicional, sin embargo, a travs de la herencia, es como si tuviera tres atributos. Isabel Montoya Adriana Gomez 38

Aplicacion.java
import java.io.*; public class Aplicacion { public static void main ( String args[ ] ) throws Exception { Coordinador coordinador; coordinador = new Coordinador ( ); coordinador.setDatos ( ); coordinador.verDatos ( ); } } // Fin de la clase Aplicacion

Coordinador.java
import java.io.*; public class Coordinador { public SuperClase madre; public ClaseHija hija; public Coordinador ( ) { madre = new SuperClase ( ); hija = new ClaseHija ( ); } public void setDatos ( ) { madre.setNombre ( madre.setApellido ( hija.setNombre ( hija.setApellido ( hija.setEdad ( }

"Isabel" "Montoya" "Adriana" "Gomez" 38 );

); ); ); );

4 public void verDatos ( ) { System.out.println ( + System.out.println ( + + } } // Fin de la clase Coordinador

madre.getNombre " " + madre.getApellido hija.getNombre " " + hija.getApellido " " + hija.getEdad

( ( ( ( (

) ) ); ) ) ) );

SuperClase.java
public class SuperClase { protected String nombre; protected String apellido; public SuperClase ( ) { nombre = ""; apellido = ""; } public void setNombre ( String nuevoNombre ) { nombre = nuevoNombre; } public void setApellido ( String nuevoApellido ) { apellido = nuevoApellido; } public String getNombre ( ) { return nombre; } public String getApellido ( ) { return apellido; } } // Fin de la clase SuperClase

ClaseHija.java
public class ClaseHija extends SuperClase { private int edad; public ClaseHija ( ) { edad = 0; } public void setEdad ( int nuevaEdad ) { edad = nuevaEdad;

5 } public int getEdad ( ) { return edad; } } // Fin de la clase ClaseHija Observe que el uso de los mtodos getNombre y getApellido no estn definidos en ClaseHija, pero en la clase Coordinador se utilizan en el objeto hija como si fueran de ella.

Clases y mtodos abstractos


Es posible que con la herencia se termine creando una familia de clases con un interfaz comn. En esos casos es posible, y hasta probable, que la clase raz de las dems no sea una clase til, y que el usuario nunca cree objetos (instancias) de ella, porque su utilidad es inexistente. Si no se desea implementar los mtodos de una clase que va a tener subclases, slo se necesita declarar la interfaz comn. Entonces, los mtodos deben ser declarados como abstractos.

Ejemplo 3
A continuacin se puede apreciar la forma de declarar una clase abstracta y un mtodo abstracto.

El Gato es el que se mueve El Perro es el que se mueve

Aplicacion.java
public class Aplicacion { public static void main ( String [ ] args ) { Gato miGato; Perro miPerro; miGato = new Gato ( ); miPerro = new Perro ( ); miGato.mover ( ); miPerro.mover ( ); } } // Fin de la clase Aplicacion

Mamifero.java
public abstract class Mamifero { protected String especie; protected String color; public void setColor ( String nuevoColor ) { color = nuevoColor; }

6 public String getColor ( ) { return color; } public void setEspecie ( String nuevaEspecie ) { especie = nuevaEspecie; } public String getEspecie ( ) { return especie; } public abstract void mover ( ); } // Fin de la clase Mamifero

Gato.java
public { class Gato extends Mamifero private int numeroPatas; public void setNumeroPatas ( int valor ) { numeroPatas = valor; } public int getNumeroPatas ( ) { return numeroPatas; } public void mover ( ) { System.out.println ( "El Gato es el que se mueve" ); } } // Fin de la clase Gato

Perro.java
public { class Perro extends Mamifero private int numeroPatas; public void setNumeroPatas ( int valor ) { numeroPatas = valor; } public int getNumeroPatas ( ) { return numeroPatas; } public void mover ( )

7 { System.out.println ( "El Perro es el que se mueve" ); } } // Fin de la clase Perro Observe en el la clase abstracta mamfero, y en ella la declaracin del mtodo mover. Tenga en cuenta que este mtodo no tiene ninguna lnea de cdigo, simplemente termina con el caracter punto y coma. Este mtodo se ha declarado como abstracto. Cuando existe al menos un mtodo abstracto, la clase debe ser declarada como abstracta. Si no es as, el compilador arrojar un error. Al declarar una clase como abstracta, el usuario no puede crear instancias de ella. Interfaces Un interfaz es como una clase abstracta pero no permite que ninguno de sus mtodos est implementado. Se declaran sustituyendo la palabra class por interface.

Ejemplo 4
A continuacin se puede apreciar la forma de declarar una clase abstracta y un mtodo abstracto.

El Gato es el que se mueve

Aplicacion.java
public class Aplicacion { public static void main ( String [ ] args ) { Gato miGato; miGato = new Gato ( ); miGato.mover ( ); } } // Fin de la clase Aplicacion

Mamifero.java
public interface Mamifero { public void mover ( ); } // Fin de la interface Mamifero

Gato.java
class Gato implements Mamifero { private int numeroPatas; public void mover ( ) { System.out.println ( "El gato es el que se mueve" ); }

8 } // Fin de la clase Gato En una interface no es necesario escribir la palabra abstract en ninguno de los mtodos ni en el nombre de la clase. Hay que fijarse que cuando una clase va a implementar los mtodos de la interface, debe implementarlos todos y no utiliza la palabra extends, sino implements.

Polimorfismo
Es la capacidad mediante la cual distintos objetos pueden responder al mismo mensaje de formas diferentes, porque un mismo mensaje puede desencadenar un comportamiento distinto dependiendo del receptor. En muchas ocasiones, cuando se utiliza herencia se puede terminar con una familia de clases que comparten un interfaz comn. Por ejemplo, si se crea un nuevo archivo que contenga a Mamifero y Gato.

Ejemplo 5
A continuacin se puede apreciar un ejemplo de polimorfismo en el cual se crea un mtodo que recibe por parmetro un objeto de la superclase, pero al llamar el mtodo se le pasa un objeto de una subclase, gracias a la relacin es un entre la superclase y la subclase. El Gato es el que se mueve El Perro es el que se mueve

Aplicacion.java
public class Aplicacion { public static void main ( String [ ] args ) { Gato miGato; Perro miPerro; miGato = new Gato ( ); miPerro = new Perro ( ); muevete ( miGato ); muevete ( miPerro ); } public static void muevete ( Mamifero animal ) { animal.mover ( ); } } // Fin de la clase Aplicacion

Mamifero.java
public class Mamifero { protected String especie; protected String color; public void setColor ( String nuevoColor )

9 { color = nuevoColor; } public String getColor ( ) { return color; } public void setEspecie ( String nuevaEspecie ) { especie = nuevaEspecie; } public String getEspecie ( ) { return especie; } public void mover ( ) { System.out.println ( "El Mamifero se mueve" ); } } // Fin de la clase Mamifero

Gato.java
public class Gato extends Mamifero { private int numeroPatas; public void setNumeroPatas ( int valor ) { numeroPatas = valor; } public int getNumeroPatas ( ) { return numeroPatas; } public void mover ( ) { System.out.println ( "El Gato es el que se mueve" ); } } //Fin de la clase Gato

Perro.java
public { class Perro extends Mamifero private int numeroPatas; public void setNumeroPatas ( int valor ) { numeroPatas = valor;

10 } public int getNumeroPatas ( ) { return numeroPatas; } public void mover ( ) { System.out.println ( "El Perro es el que se mueve" ); } } // Fin de la clase Perro El polimorfismo consiste en que toda referencia a un objeto de una clase especfica puede tomar la forma de una referencia a un objeto de una subclase de ella.

Sobrecarga de mtodos
Java permite que varios mtodos dentro de una clase se llamen de la misma forma, siempre y cuando su lista de parmetros sea distinta.

Ejemplo 6
En una misma clase se pueden tener dos mtodos llamados sumar, para calcular la suma de dos nmero, ya sen de tipo int o double. Estoy sumando reales 3.0 Estoy sumando enteros 8

Sumar.java
public class Sumar { public static void main ( String [ ] args ) { double x, y; int v, w; x = 1; y = 2; v = 3 ; w = 5; System.out.println ( suma ( x, y ) ); System.out.println ( suma ( v, w ) ); } public static double suma ( double a, double b ) { System.out.println ( "Estoy sumando reales" ); return a + b; }

11 public static int suma ( int a, int b ) { System.out.println ( "Estoy sumando enteros" ); return a + b; } } Para que se pueda aplicar la sobrecarga de mtodos es necesario evitar la ambigedad. Es decir, la lista de los parmetros que recibe el mtodo sobrecargado debe ser diferente entre cada uno de los mtodos que comprte el mismo nombre, ya sea en cantidad de parmetros o en el tipo de datos de alguno de ellos. La sobrecarga de mtodos tambin se puede aplicar al mtodo constructor de una clase.

Ejemplo 7
Aplicar la sobrecarga de mtodos al mtodo constructor de la clase Rectangulo.java. Area 1: 12.0 Area 2: 1.0

Rectangulo.java
public class Rectangulo { private float x1, y1, x2, y2; public Rectangulo { this.x1 = this.y1 = this.x2 = this.y2 = } ( float x1, float y1, float x2, float y2 ) x1; y1; x2; y2;

public Rectangulo ( ) { this ( 0, 0, 1, 1 ); } public static void main ( String [ ] args ) { Rectangulo prueba1; Rectangulo prueba2; prueba1 = new Rectangulo ( 1, 4, 7, 6 ); prueba2 = new Rectangulo ( ); System.out.println ( "Area 1: " + prueba1.calcularArea ( ) ); System.out.println ( "Area 2: " + prueba2.calcularArea ( ) ); } public float calcularArea ( ) { return ( x2 - x1 ) * ( y2 - y1 ); } } // Fin de la clase Rectangulo

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