Bienvenidos sean a este post, hoy hablaremos sobre una de las acciones mas importante en todo lenguaje heredero de C, que son justamente las herencias. La herencia es la posibilidad que nos brinda el lenguaje de poder enviar los metodos o argumentos de una clase a otra, esto siempre tiene una jerarquia, es decir la clase que va a ser heredera se la llama subclase pero tambien se le dice clase hija o clase derivada, y la clase que va a ser la que comparta sus contenido es la superclase, tambien conocida como clase base o clase padre, nuestro siguiente paso sera hablar sobre la palabra clave extends.

extends es utilizado para poder recibir las propiedades de una clase, su sintaxis es:

class nombreSuoer
{
… Instrucciones …
}
class nombreSub extends nombreSuper
{
… Instruccione …
}

Para entender un poco mejor este concepto veamos el siguiente ejemplo:

Mi_Calculo.java

class Calculo
{
        int z;

        public void adicion(int x, int y)
        {
                z = x + y;
                System.out.println("Esta suma da: " + z);
        }

        public void substraccion(int x, int y)
        {
                z = x - y;
                System.out.println("Esta resta da: " + z);
        }
}

public class Mi_Calculo extends Calculo
{
        public void multiplicacion(int x, int y)
        {
                z = x * y;
                System.out.println("La multiplicacion da: " + z);
        }

        public static void main(String[] args)
        {
                int a = 20, b = 10;
                Mi_Calculo prueba = new Mi_Calculo();
                prueba.adicion(a, b);
                prueba.substraccion(a, b);
                prueba.multiplicacion(a, b);
        }
}

Primero vamos a crear una clase llamado Calculo, esta va a tener dos metodos, una para sumar (adicion) y otro para restar (substraccion), como pueden ver cada metodo recibe dos argumentos, efectua la accion relacionado y devuelve un mensaje con el resultado de la accion y los argumentos, despues tendremos nuestra clase principal, en la cual habra un metodo llamado multiplicacion() el cual hara la multiplicacion entre dos argumentos, despues tendremos a main() pero antes observen como nuestra clase uso la palabra extends para poder heredar los metodos de la clase Calculo, ahora si pasemos a nuestro metodo main() donde crearemos dos variables con valores (a y b) despues crearemos un objeto de nuestra clase Mi_Calculo llamado prueba y a este objeto le ejecutaremos los metodos de Calculo y el de Mi_Calculo, si lo compilamos y ejecutamos veremos la siguiente salida:

tinchicus@dbn001vrt:~/programacion/java/program$ java Mi_Calculo
Esta suma da: 30
Esta resta da: 10
La multiplicacion da: 200
tinchicus@dbn001vrt:~/programacion/java/program$

Como pueden ver en la salida se ejecutaron los tres metodos correctamente, esto es lo que nos permite la herencia es decir poder pasar de una clase cualquiera a otra clase los metodos y variables, excepto los constructores, para poder utilizarlos con el objeto creado de la clase heredera, nuestra siguiente parada sera la palabra clave super.
La palabra super es similar a this, esta palabra sera utilizada de la siguiente forma:

  • Se usa para diferenciar los de miembros de la superclase con la subclase, en caso de tener los mismos nombres
  • Se usa para invocar al constructor de la superclase desde la subclase.

Como dijimos en el primer caso si tuvieramos los miembros (metodos, variables) de una superclase y los miembros de una subclase con los mismos nombres, para ello se utiliza de esta forma:

super.variable;
super.metodo();

Como pueden ver la nomenclatura es simple debemos anteponer la palabra super y luego usamos el nombre de la variable o el metodo correspondiente a la superclase para entenderlo un poco mejor veamos el siguiente ejemplo:

Sub_Clase.java

class Super_Clase
{
        int num = 20;

        public void mostrar()
        {
                System.out.println("Esto es de la Super Clase");
        }
}

public class Sub_Clase extends Super_Clase
{
        int num = 10;

        public void mostrar()
        {
                System.out.println("Esto es de la Sub Clase");
        }

        public void mimetodo()
        {
                Sub_Clase sub = new Sub_Clase();

                sub.mostrar();

                super.mostrar();

                System.out.println("valor de num de la sub clase: "
                                        + sub.num);

                System.out.println("Valor de num de la super clase: "
                                        + super.num);
        }

        public static void main(String[] args)
        {
                Sub_Clase obj = new Sub_Clase();
                obj.mimetodo();
        }
}

En este ejemplo primero crearemos una clase llamada Super_Clase, donde crearemos una variable llamada num y le asignamos el valor de 20 y luego crearemos un metodo llamado mostrar() el cual mostrara un mensaje, despues tendremos nuestra clase llamada Sub_Clase la cual sera heredera de Super_Clase por medio de extends, en ella definiremos un metodo llamado mostrar() donde mostrara un mensaje, luego definiremos otro metodo llamado mimetodo(), en este metodo crearemos un objeto llamado sub de la clase Sub_Clase, despues ejecutaremos el metodo mostrar() del objeto sub, nuestra siguiente linea sera llamar al metodo mostrar() de la super clase por medio de la palabra super, despues mostraremos el valor almacenado en num de la sub clase, y por ultimo mostraremos el valor de num almacenado en la super clase, en el cuerpo del main() crearemos un objeto de la sub clase y luego llamaremos a mimetodo(), si lo compilamos y ejecutamos veremos lo siguiente:

tinchicus@dbn001vrt:~/programacion/java/program$ java Sub_Clase
Esto es de la Sub Clase
Esto es de la Super Clase
valor de num de la sub clase: 10
Valor de num de la super clase: 20
tinchicus@dbn001vrt:~/programacion/java/program$

Como pueden ver, gracias a la palabra super hemos podido diferenciar los metodos y las variables de las clases super y sub, en algunas otras circunstancias necesitaremos iniciar al constructor de nuestra super clase con un valor y para esto se utiliza tambien la palabra super, la sintaxis es la siguiente:

super(valor);

Para ello veamos el siguiente ejemplo:

Subclase.java

class Superclase
{
        int edad;

        Superclase(int edad)
        {
                this.edad = edad;
        }

        public void consigueEdad()
        {
                System.out.println("El valor de la variable edad es: "
                                        + edad);
        }
}

public class Subclase extends Superclase
{
        Subclase(int edad)
        {
                super(edad);
        }

        public static void main(String[] args)
        {
                Subclase s = new Subclase(24);
                s.consigueEdad();
        }
}

En este ejemplo tendremos una super clase llamada Superclase, la cual tendra una variable llamada edad, despues tendra un constructor el cual recibir un argumento y ese valor se lo asignara a la variable edad de la super clase por medio del this, y por ultimo en esta super clase habra un metodo llamado consigueEdad() el cual se encargara de mostrar un mensaje con el valor asignado a edad, en nuestra sub clase llamado Subclase al ser heredera de Superclase va a tener acceso a la super clase, el constructor de la sub clase recibira un dato y luego por medio de la palabra super le enviamos el valor informado al constructor de la sub clase, luego tendremos a main() donde crearemos un objeto llamado s de la clase Subclase y usamos el constructor donde le enviamos un valor, el cual se asignara a edad en la super clase, y luego mostraremos el valor por medio de conseguirEdad(), si lo compilamos y ejecutamos veremos la siguiente salida:

tinchicus@dbn001vrt:~/programacion/java/program$ java Subclase
El valor de la variable edad es: 24
tinchicus@dbn001vrt:~/programacion/java/program$

Como pueden ver gracias a super pudimos enviar el valor a la variable edad y esta se asigno correctamente, nuestro siguiente tipo de herencia es la relacion ES-UN (IS-A relationship).

Este tipo de relacion es cuando queres decir que este objeto es un tipo de esta clase, veamos el siguiente ejemplo de sintaxis:

public class Animal {
… Instrucciones …
}
public class Mamifero extends Animal {
… Instrucciones …
}
public class Reptil extends Animal {
… Instrucciones …
}
public class Perro extends Mamifero {
… Instrucciones …
}

Del ejemplo anterior podemos ver como tenemos una clase maestra (o base) y despues tenemos clases que podemos considerar verdaderas porque:

  • Mamifero ES UN Animal
  • Reptil ES UN Animal
  • Perro ES UN Mamifero
  • Perro tambien ES UN Animal

Si analizamos a nivel clases veremos que son verdaderas porque:

  • Animal ES UNA super clase de Mamifero y Reptil
  • Mamifero ES UNA sub clase de Animal
  • Reptil ES UNA sub clase de Animal
  • Perro ES UNA sub clase de Mamifero y Animal

Con el uso de extends podemos hacer herederos a las distintas clases y a su vez estas recibiran la herencia de la clase que hereda, por ejemplo analicemos el caso de Perro, esta clase es heredera de Mamifero pero la clase Mamifero es heredera de Animal, esto quiere decir que Perro no solamente tendra acceso a las variables y metodos de Mamifero sino tambien a los de Animal, recuerden siempre que los herederos solamente tendran acceso a los metodos y variables publicos de la super clase, nuestro siguiente operador sera instanceof.

instanceof es un operador (o metodo) utilizado para determinar si el objeto informado es una instancia de la clase informada, este operador es de tipo booleano por lo que solamente va a dar dos tipos de respuestas: verdadero o falso, su sintaxis es:

nombreObjeto instanceof nombreClase;

Veamos el siguiente ejemplo donde pondremos en practica la relacion ES UN y el operador instanceof:

Perro.java

class Animal {}

class Mamifero extends Animal{}

class Reptil extends Animal{}

public class Perro extends Mamifero
{
        public static void main(String[] args)
        {
                Animal a = new Animal();
                Mamifero m = new Mamifero();
                Perro p = new Perro();

                System.out.println(m instanceof Animal);
                System.out.println(p instanceof Mamifero);
                System.out.println(p instanceof Animal);
        }
}

En este ejemplo tenemos una clase base llamada Animal, luego otra llamada Mamifero la cual es heredera de Animal, lo mismo con Reptil y por ultimo la clase Perro que sera heredera de Mamifero, luego en el cuerpo de main() crearemos un objeto de Animal llamado a, luego otro de Mamifero llamado m y por ultimo de Perro llamado p, luego imprimiremos el mensaje obtenido de instanceof, si lo compilamos y ejecutamos obtendremos esto:

tinchicus@dbn001vrt:~/programacion/java/program$ java Perro
true
true
true
tinchicus@dbn001vrt:~/programacion/java/program$

En este caso obtendremos todo true (verdadero) porque m es instancia de Animal, p es instancia de Mamifero y por ultimo p es instancia de Animal tambien todo esto por medio de las herencias enviadas por medio de los extends de cada clase, y por ultimo hablaremos de la relacion TIENE UN (HAS-A), analicemos el siguiente ejemplo:

public class Vehiculo {}
public class Velocidad {}

public class SUV extends Vehiculo {
private Velocidad vl;
}

En este ejemplo podemos ver como la clase SUV TIENE UN Objeto de Velocidad, esto es gracias a que la clase existe por fuera de la clase SUV entonces en lugar de tener que insertar el codigo de Velocidad dentro de la clase utilizamos esta forma para llamarlo la cantidad de veces que sea necesaria, esto no solo nos permite reutilizar un codigo sino que tambien reduce la duplicacion de codigo y nos disminuye los posibles errores (bugs).

En resumen, hoy hemos visto los distintos tipos de herencia soportados por Java, hemos visto como se utilizan, como trabajan, hemos hablado de que se comparte en una herencia, como las herencias de una clase son heredadas por sus clases herederas, recuerden que las herencias son unicamente de los miembros publicos, la relacion ES UN, la relacion TIENE UN, el operador instanceof, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios