miércoles, 16 de mayo de 2012

Herencia en Java

HERENCIA EN JAVA

Java permite el empleo de la herencia , característica muy potente que permite definir una clase tomando como base a otra clase ya existente. La idea es permitir la creación de  nuevas clases basadas en clases existentes. Cuando heredamos de una clase existente, reusamos  (o heredamos) métodos y campos, y agregamos nuevos campos y métodos para cumplir con la situación nueva.
Cada vez que encontremos la relación "es-un" entre dos clases, estamos ante la presencia de herencia.
  • Superclase y Subclases
    El concepto de herencia conduce a una estructura jerárquica de clases o estructura de árbol, lo cual significa que en la POO todas las relaciones entre clases deben ajustarse a dicha estructura.

    En esta estructura jerárquica, cada clase tiene sólo una clase padre. La clase padre de cualquier clase es conocida como susuperclase. La clase hija de una superclase es llamada una subclase


    Una superclase puede tener cualquier número de subclases.

    * Una subclase puede tener sólo una superclase.






  • A es la superclase de B, C y D.
  • D es la superclase de E.   
  • B, C y D son subclases de A.
  • E es una subclase de D.


  • Existen dos tipos de herencia sencilla y múltiple.
    Sencilla significa que sólo heredamos de una clase base, mientras que múltiple indica que tenemos varias clases.

     Limitaciones en la Herencia

    Todos los campos y métodos de una clase son siempre accesibles para el código de la misma clase.

    Para controlar el acceso desde otras clases, y para controlar la herencia por las subclase, los miembros (atributos y métodos) 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 sólo en la propia clase.
    protected: Los miembros declarados protected son accesibles sólo para sus subclases
    Por ejemplo:

    class Padre { // Hereda de Object
    // Atributos
          private int numeroFavorito, nacidoHace, dineroDisponible;
    // Métodos
         public int getApuesta() {
                  return numeroFavorito;
         }


          protected int getEdad() {
                 return nacidoHace;
          }
          private int getSaldo() {
                return dineroDisponible;
          }
    }


    class Hija extends Padre {
     // Definición
    }     class Visita {
         // Definición
    }

    Inicialización de clases derivadas

    Cuando se crea un objeto de una clase derivada se crea implicitamente un objeto de la clase base que se inicializa con su constructor correspondiente. Si en la creación del objeto se usa el constructor no-args, entonces se produce una llamada implicita al constructor no-args para la clase base. Pero si se usan otros constructores es necesario invocarlos explicitamente. 
    En nuestro ejemplo dado que la clase método define un constructor, necesitaremos también un constructor para la clase Ejecutivo, que podemos completar así:
    class Ejecutivo extends Empleado {
        int presupuesto;

        Ejecutivo (String n, int s) {
            super(n,s);
        }

        void asignarPresupuesto(int p) {
            presupuesto = p;
        }

        public String toString() {
            String s = super.toString();
            s = s + " Presupuesto: " + presupuesto;
            return s;
        }
    }




    Bibliografia:

    No hay comentarios:

    Publicar un comentario