De la herencia, el polimorfismo, la sobrecarga y sobrescritura de métodos

Los conceptos de herencia, sobrecarga, sobrescritura y polimorfismo, son importantes para el programador en java debido a que le permite reutilizar código y por consiguiente, ahorrar memoria. 

Si bien estos conceptos tienen cierta complicación a considerar por el estudiante de programación, pues se constituyen de un nivel de abstracción más alto, resultan bastante útiles una vez que se desarrolla práctica programando con ellos. 


Herencia: La herencia nos permite reutilizar código, a través de una relación entre las diferentes clases que intervengan. Se diferencian clases y subclases; específicamente, clases padre y clases hijas. Las clases de donde provengan todas las demás; es decir, aquellas que estén en la cima de una cadena de ascendencia, se denominan "superclases".

Básicamente, las clases hijas provienen de las clases padre, y por consiguiente, éstas utilizan los métodos y atributos de los padres. Además, las clases hijas contienen otros atributos, o métodos, adicionales a los heredados de la clase padre. Así mismo, y al igual que muchas otras funciones específicas de Java, estas acciones se efectúan de acuerdo a una nomenclatura definida. Como se mostrará en el siguiente caso:

Como se puede apreciar en la imagen anterior, el comando "extends" seguido por la clase padre, aparece ahora en la declaración de la clase. "Extends" le indica a Java que los atributos y métodos de la clase padre deben ser heredados ahora en la clase hija. 

Se puede apreciar dentro del constructor, "super()", que nos permite heredar atributos de la clase padre, con los valores inicializados dentro de la clase padre, de manera que no sea necesario inicializarlos nuevamente dentro del nuevo constructor de la clase hija.

Por otro lado, los atributos de la clase padre deben de estar antecedidos por el modificador de acceso "protected". De esta forma, las clases hijas pueden acceder a los atributos de la clase padre en cuestión.


Polimorfismo: Es la capacidad que tiene un objeto de una clase, de transformarse y de evaluarse dentro de las clases hijas, con otros métodos y atributos adicionales; pero sin dejar de ser un mismo objeto.

Lo intuitivo sería pensar que para cada clase es necesario un objeto diferente de los demás, pero con el polimorfismo vemos que eso no es  necesario siempre. Se puede, a través de la misma información, moldear una misma instancia dentro de clases con distintas especificaciones, siendo estas últimas clases hijas. 

Por otro lado el polimorfismo respeta ciertos criterios de herencia; esto es, que una instancia de una superclase puede evaluarse dentro de las demás subclases, pero las instancias de una subclase no podrían evaluarse en la superclase. La superclase contiene a las demás clases, por eso puede evaluarse en ellas, mientras que las subclases no contienen a la superclase, y por tanto no pueden evaluarse en ella.






De esta manera tendríamos que una figura puede ser evaluada en varios tipos de figura, y por tanto se puede instanciar dentro de una clase figura, un objeto evaluado en la subclase cubo. Respectivamente esta sería la nomenclatura necesaria:


Donde observamos la estructura "[clase padre] obj = new [subclase];".


Sobrecarga de Métodos: Es una acción que nos permite reutilizar métodos dentro de una clase, las veces que sean necesarias, con la finalidad de reutilizar el código dentro de esos métodos (Pueden ser procedimientos, o funciones; hasta constructores).

Entre los varios recursos que se mencionan en este blog quizá la sobrecarga de métodos resulte uno de los más útiles. Así mismo, se debe ser cuidadoso y muy consciente del trabajo en cuestión que se trata de codificar valiéndose de este recurso, ya que hay cierto detalle que se debe tomar en consideración para evitarnos errores de compilación.

Verán, ya mencionamos que podemos usar el mismo método varias veces, pero ¿Cómo se distribuirán los parámetros en el caso extremo de que tengamos 20 métodos llamados "imprimir()"? Pues es aquí donde se debe tener cautela, pues Java diferenciará los métodos basándose en los parámetros que les son transferidos a estos métodos. Es decir, que los métodos (Que tienen el mismo nombre y disposición) no pueden contener los mismos parámetros, estos han de ser distintos. 

En adición a lo anterior, estos métodos sobrecargados, se discriminan únicamente a través de los parámetros que evalúen. No importa entonces que el tipo de dato de retorno de un método cualquiera, sea distinto, el factor diferenciador es el parámetro. 

Veamos todo eso aplicado en la siguiente ilustración: 


Se puede observar como el método sobrecargado "test()", es utilizado dos veces, y se discriminan ambos métodos a través de los parámetros evaluados en cada uno. En en primero se traspasa el "int X". En el segundo se traspasan "int X" e "int Y". Como en uno sólo se evalúa un solo parámetro del tipo entero y en el segundo se evalúan dos, Java puede diferenciarlos; y no se produce el error de compilación.

Como los constructores, en cierto sentido, son métodos, se pueden sobrecargar los constructores dentro de una clase:



Sobrescritura de Métodos: Aquí las clases adquieren los métodos de otras clases por medio de la sobrescritura. Así mismo, las clases hijas que no tengan acceso a un método determinado de la clase padre de la cual heredan, pueden sobrescribir los métodos, sin necesidad de modificar los parámetros evaluados en el método en cuestión.

Es un concepto bastante sencillo, es concatenable  con la idea de importar una clase; sólo que en este caso se importa un método de otra clase determinada, y que no requiere estar dentro del mismo paquete.

Se utiliza el indicativo "Override"  para indicar la sobreescritura de un método cualquiera.

En el caso siguiente:


Los métodos de la clase A ["getX()" y "doIT()"] son sobrescritos dentro de la clase B que hereda de A; y se hace uso del indicativo "Override" para que Java interprete la sobreescritura de los métodos en cuestión.

















Comentarios

Entradas populares