viernes, 28 de abril de 2017

19-Programación Orientada a Objetos en Java (IX). La Herencia.

Muy buenas a tod@s, en primer lugar pedir perdón por tardar tanto en seguir con los tutoriales pero he estado muy liado con mis estudios. Pero los tutoriales no van a ser dejados a medio y se van a terminar, es más, incluso tengo ya en mente otros tutoriales más como de bases de datos de Oracle, programación en Unity, programación en Android.... Pero todo poco a poco y a su debido tiempo.

En el tutorial de hoy vamos a aprender qué es la herencia en Java y cómo se utiliza. Bueno, sin más escusas vamos a ver en primer lugar la herencia.

La Herencia

Primero de todo vamos a definir lo que es la herencia, para después ver con ejemplos cómo funciona y cómo utilizarla.
En tutoriales anteriores hemos visto ya qué son las clases y que a través de estas clases podemos instanciar o crear objetos. Cada objeto creado de una clase tendrá los mismos atributos y métodos pero cada uno con sus valores particulares de dicho objeto.
Pues bien, habrá veces que un objeto, por sus características, deba tener unos atributos y/o métodos que ya han sido definidos en otra clase distinta a ese objeto. Con la herencia, ese objeto heredará todos los atributos y métodos definidos en la clase de la que hereda y, además podrá tener sus atributos y métodos particulares de ese objeto.
La clase que hereda de otra clase se le denomina subclase, y la clase que es heredada se le denomina superclase.
En Java sólo es posible la herencia simple, no permitiendo por lo tanto la herencia compuesta, es decir, una clase no puede heredar más de una superclase. Esto quiere decir que una clase sólo puede tener una superclase, aunque una clase puede ser heredada por varias subclases.
Todas las clases descienden de la clase Object.
Para que una clase herede de otra clase se debe de utilizar la palabra reservada extends. Veamos un ejemplo:

public class nombreSubclase extends nombreSuperclase {
    
}

De la forma anterior la clase nombreSubclase heredará todos los atributos y métodos de la clase nombreSuperclase.
Una cosa importante, a la vez que lógica, es que una clase heredará de otra clase sólo los métodos y atributos que no sean privados. Si tenemos atributos privados en la superclase, debemos crear los correspondientes set and get para poder acceder a estos valores. Si no sabes lo que son los métodos set and get, dirígete al tutorial 14.

Como siempre digo, tanto texto, tan engorroso que parece que la herencia es algo para gente que trabaja en la N.A.S.A. Pero nada más lejos de la realidad, vamos a ver a continuación con un sencillo ejemplo cómo utilizar la herencia. Para ello tenemos creada una clase Persona, con los atributos y métodos básicos que tienen las personas, luego crearemos nuestra clase Alumno. Esta clase Alumno, si nos paramos a pensar, deduciremos que un Alumno es una Persona, por lo tanto heredará los atributos y métodos de esta clase y así no tendremos que volver a definir estos atributos y métodos.
Luego crearemos el programa con el método main principal y observaremos cómo desde un objeto de la clase Alumno podemos acceder a los atributos y métodos definidos tanto en la clase Alumno, como de su superclase Persona.

Clase Persona. Clase que será superclase de la clase Alumno

public class Persona {
    
    //Atributos
    String nombre;
    String apellidos;
    int edad;
    String trabajo;
    
    
    //Método constructor sin parámetros. Este constructor iniciará cada dato 
    //a su valor por defecto
    public Persona(){
        
    }
    
    //Método constructor que inicializa los atributos a los valores que le pasemos
    //como argumentos cuando creemos una instancia de esta clase.
    public Persona(String nombre, String apellidos, int edad, String trabajo){
        
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.edad = edad;
        this.trabajo = trabajo;
        
    }
    
    //Método constructor que se le pasa como parámetro un objeto de la clase 
    //Persona. Esto significa que este objeto tendrá los mismos valores en 
    //los atributos que el objeto pasado como argumento.
    public Persona(Persona b){
        this.nombre = b.nombre;
        this.apellidos = b.apellidos;
        this.edad = b.edad;
        this.trabajo = b.trabajo;
    }
    
    public void mostrarMensaje(){
        System.out.println("Esto es la clase Persona, que será superclase de la clase Alumno");
    }
    
}

Clase Alumno que será subclase de la clase Persona


public class Alumno extends Persona {
    
    //Atributos específicos de Alumno
    String curso;
    int notaMedia;
    String nombreColegio;
    
    //Métodos propios de Alumno
    
    public void calcularNotaMedia(){
        //Definiríamos el método para calcular la nota media
    }
    
    public void cambiarColegio(String nuevoColegio){
        nombreColegio = nuevoColegio;
    }
}
 
Como vemos, la clase Alumno es una clase muy básica y que no hemos tenido que definir atributos básicos como nombre, apellidos... ya que los heredará de la clase Persona
Ahora vamos a crear el programa dónde crearemos un objeto de Alumno, llamado alumno1 y en el que podremos observar que podemos acceder a todos los atributos y métodos tanto de la propia clase Alumno, como de la superclase Persona (Si hubieran atributos/métodos privados no se podrían acceder a ellos).

Programa principal dónde comprenderemos el uso de la herencia:

public class ProgramaHerencia {
    
    public static void main(String[] args) {
        
        Alumno alumno1 = new Alumno();
        //Le ponemos un nombre y apellidos a través del uso de la herencia
        alumno1.nombre = "Javier";
        alumno1.apellidos = "Carreño Ortega";
        alumno1.mostrarMensaje();//Método de la clase Persona que es heredado
        alumno1.curso = "2º Primaria";//Propio atributo de la clase Alumno
        alumno1.cambiarColegio("Otro colegio nuevo");//Propio atributo de la clase Alumno
        
    }
}
 
 
Como hemos podido comprobar, la herencia es una herramienta muy útil para agilizar nuestro trabajo e impedir escribir de nuevo código ya implementado. Las subclases heredan de las superclases y hacen propios los atributos y métodos heredados.
Un buen truco para saber si una clase tiene que heredar de otra es utilizar la expresión "es un/a". Por ejemplo en nuestro caso, un Alumno es una Persona, por lo tanto es muy probable que Alumno tenga que heredar de Persona.

Bueno y esto est todo en este tutorial, espero que esté todo muy claro y que sigáis atentos a más tutoriales y código fuente que iré publicando.
En el siguiente tutorial veremos de la palabra reservada super y de la sobrescritura de métodos.

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...