¿QUÉ es la herencia en programación orientada a objetos?



Descargar 170,75 Kb.
Página2/4
Fecha de conversión24.03.2017
Tamaño170,75 Kb.
1   2   3   4

















Protected


Al principio los modificadores de acceso pueden resultar un tanto inútiles puesto que, si puedes acceder directamente a un atributo, ¿para que vas a modificarlos mediante un método?, pues bien, como norma general los atributos de nuestras clases serán private o protected si utilizaremos herencia. Para modificar atributos o consultar su valor utilizaremos métodos, siendo esta la base de la encapsulación que consiste en hacer visible los atributos o métodos que sean realmente necesarios.

Para controlar el acceso a nuestros atributos y métodos se utilizan los modificadores de acceso que no son más que palabras reservadas del lenguaje que se encargarán de controlar desde dónde serán accesibles los miembros de una clase, estos modificadores son:



  • private (Acceso solo dentro de la clase)

  • protected (Acceso desde la clase y sus hijos "herencia")

  • Vacío (Sin escribir nada, denominado acceso de paquete)

  • public (Acceso publico desde cualquier lugar)

Estos modificadores de acceso se colocan justo delante del valor de retorno de un método, o del tipo de un atributo, así que de momento y hasta que no expliquemos el concepto de herencia, utilizaremos los más sencillos, private y public. A continuación podemos ver un ejemplo de su uso en una clase:

?

1

2

3



4

5

6



7

8

9



10

11

12



13

14

15



16

17

18



19

20

21



public class Vehiculo {

    //Atributos con acceso private

    private String modelo;

    private int velocidad;

    private boolean arrancado;

    //El constructor siempre debe de ser public

    public Vehiculo(String modelo, int velocidad, boolean arrancado) {

        this.modelo = modelo;

        this.velocidad = velocidad;

        this.arrancado = arrancado;

    }  

    //Atributos getter con acceso public

    public String getModelo() {

        return modelo;

    }

 

    public int getVelocidad() {



        return velocidad;

    }


 

    public boolean isArrancado() {

        return arrancado;

    } }


Como vemos, hemos definido los atributos private, así nadie podrá modificarlos sin nuestro consentimiento, el constructor es public para permitir instancias de la clase desde fuera del archivo Vehiculo.java, y los métodos get serán también public, para permitir a cualquiera consultar el valor de nuestros atributos.

Con los modificadores de acceso, evitamos que nuestros programas tengan un uso no deseado, como modificar atributos introduciendo valores inválidos o llamando a métodos que pueden tener efectos no deseados.

El cuanto al modificador protected, este hace nuestro miembro (atributo o método) accesible desde la propia clase, y también desde las clases que hereden de esta o subclases.



Buenas prácticas
En generar se aconseja declarar todos los atributos como private, y cuando necesitemos consultar su valor o modificarloutilicemos los métodos get y set. Además en caso de que el tipo de valor devuelto por el método sea un boolean, se utilizará is en vez de get. A continuación podéis ver un ejemplo donde lo veréis todo más claro:

?

1

2

3



4

5

6



7

8

9



10

11

12



13

14

15



16

17


//Atributos private

private String nombre;

private boolean casado;

 

//Metodos get y set para estos atributos



public void setNombre(String nombre) {

    this.nombre = nombre;

}

public void setCasado(boolean casado) {



    this.casado = casado;

}

public String getNombre() {



    return nombre;

}

public boolean isCasado() {



    return casado;

}


Como vemos los metodos setCasado y setNombre se encargan de modificar los atributos y los métodos getNombre y isCasado nos permiten obtener sus valores.

Recuerda que cuando utilizamos "this.nombre" nos referimos al atributo nombre de la clase y con "nombre" nos referimos al parámetro con el mismo nombre.

 

Super


EJEMPLO DE HERENCIA EN JAVA. EXTENDS Y SUPER.

Para declarar la herencia en Java usamos la palabra clave extends. Ejemplo: public class MiClase2 extends Miclase1. Para familiarizarte con la herencia te proponemos que escribas y estudies un pequeño programa donde se hace uso de ella. Escribe el código de las clases que mostramos a continuación.


 

//Código de la clase Persona ejemplo aprenderaprogramar.com

public class Persona {

    private String nombre;

    private String apellidos;

    private int edad;

    //Constructor

    public Persona (String nombre, String apellidos, int edad) {

        this.nombre = nombre;

        this.apellidos = apellidos;

        this.edad = edad;                   }

    //Métodos

    public String getNombre () { return nombre;  }

    public String getApellidos () { return apellidos;  }

    public int getEdad () { return edad;   }

} //Cierre de la clase


 

//Código de la clase profesor, subclase de la clase Persona ejemplo aprenderaprogramar.com

public class Profesor extends Persona {

    //Campos específicos de la subclase.

    private String IdProfesor;

    //Constructor de la subclase: incluimos como parámetros al menos los del constructor de la superclase

    public Profesor (String nombre, String apellidos, int edad) {

        super(nombre, apellidos, edad);

        IdProfesor = "Unknown";   } //Cierre del constructor

    //Métodos específicos de la subclase

    public void setIdProfesor (String IdProfesor) { this.IdProfesor = IdProfesor;   }

    public String getIdProfesor () { return IdProfesor;   }

    public void mostrarNombreApellidosYCarnet() {

        // nombre = "Paco"; Si tratáramos de acceder directamente a un campo privado de la superclase, salta un error

        // Sí podemos acceder a variables de instancia a través de los métodos de acceso públicos de la superclase

        System.out.println ("Profesor de nombre: " + getNombre() + " " +  getApellidos() +

         " con Id de profesor: " + getIdProfesor() ); }

} //Cierre de la clase


 

//Código de test aprenderaprogramar.com

public class TestHerencia1 {

    public static void main (String [ ] Args) {

        Profesor profesor1 = new Profesor ("Juan", "Hernández García", 33);

        profesor1.setIdProfesor("Prof 22-387-11");

        profesor1.mostrarNombreApellidosYCarnet();}



} //Cierre de la clase

 El diagrama de clases y el resultado del test son del tipo que mostramos a continuación:

 


                 Profesor de nombre: Juan Hernández García con Id de profesor: Prof 22-387-11

 Los aspectos a destacar del código son:

a) La clase persona es una clase “normal” definida tal y como lo venimos haciendo habitualmente mientras que la clase Profesor es una subclase de Persona con ciertas peculiaridades.

b) Los objetos de la subclase van a tener campos nombre, apellidos y edad (heredados de Persona) y un campo específico IdProfesor. El constructor de una subclase ha de llevar obligatoriamente como parámetros al menos los mismos parámetros que el constructor de la superclase.

c) El constructor de la subclase invoca al constructor de la superclase. Para ello se incluye, obligatoriamente, la palabra clave super como primera línea del constructor de la subclase. La palabra super irá seguida de paréntesis dentro de los cuales pondremos los parámetros que requiera el constructor de la superclase al que queramos invocar. En este caso solo teníamos un constructor de superclase que requería tres parámetros. Si p.ej. hubiéramos tenido otro constructor que no requiriera ningún parámetro podríamos haber usado uno u otro, es decir, super(nombre, apellidos, edad) ó super(), o bien ambos teniendo dos constructores para la superclase y dos constructores para la subclase. Ejemplo:



En la superclase:                                public Persona() {

                                                       nombre = "";

                                                       apellidos = "";

                                                       edad = 0; }

 

                                                       public Persona (String nombre, String apellidos, int edad) {



                                                       this.nombre = nombre;

                                                       this.apellidos = apellidos;

                                                       this.edad = edad;                   }


 

En la subclase:                                   public Profesor () {

                                                       super();

                                                       IdProfesor = "Unknown";}

 

                                                       public Profesor (String nombre, String apellidos, int edad) {



                                                       super(nombre, apellidos, edad);

                                                       IdProfesor = "Unknown";   }



 Modifica el código de las clases Persona y Profesor para que queden con dos constructores tal y como hemos mostrado aquí. Crea objetos de ambos tipos en BlueJ y prueba sus métodos.

¿Qué ocurre si olvidamos poner super como primera línea de la subclase? Hay dos posibilidades: si la superclase tiene un constructor sin parámetros, el compilador incluirá en segundo plano super de forma automática y no saltará un error. De cualquier manera se considera contrario al buen estilo de programación, ya que no queda claro si se trata de un olvido. Por ello incluiremos siempre la palabra clave super. La otra posibilidad es que no haya un constructor sin parámetros, en cuyo caso saltará un error.

A modo de resumen: la inicialización de un objeto de una subclase comprende dos pasos. La invocación al constructor de la superclase (primera línea del constructor: super…) y el resto de instrucciones propias del constructor de la subclase.

 



Compartir con tus amigos:
1   2   3   4


La base de datos está protegida por derechos de autor ©absta.info 2019
enviar mensaje

    Página principal