resumen-Cap-13 Int Java

Redactado por

Christopher Mendoza

Resumen Cap 13

Libro: Introducción a la programación con JAVA (John S. Dean, Raymon H. Dean)

Herencia y polimorfismo

Para poder explicar el polimorfismo el cual es la piedra angular de la herencia necesitas revisar algunos conceptos.

La clase Objeto y promoción automática de tipos

Esta clase es la ancestro de todas las clases en Java.

Si tu clase no extiende de otra, por defecto el compilador la hara extender de la clase Objeto.

Esta clase no tiene demasiados metodos pero tiene dos muy importantes

toString();
equals();

En caso de una asignación o de pasar un argumento que implique diferentes tipos de referencia (osea clases) normalmente la JVM asigna automáticamente a la referencia objetivo la referencia fuente. Si esta se encuentra por encima en el orden de Herencias se realiza una asginación a la clase Objeto ya que esta es la de mayor jerarquia en el orden de herencia.

(Recordemos que las SuperClases (más generales) se encuentran "encima" en la jerarquia de Herencia, entonces si nosotros pasamos una subClase esta tendra que pasar una promoción a Objeto si es necesario para ser utilzada en un lugar donde se esperaba la SuperClase)

equals();

Este metodo devuelve true o false cuando compara dos objetos

objectA.equals(ObjectB)

Como hereda de la clase objeto va a la definición mas básica del metodo "es igual?" solo obtenemos True si

  1. objectA es simplemento otro nombre para ObjectB (Ambos hacen referencia al mismo objeto)

Declarar tu propio equals();

Si necesitamos que según nuestro criteria al compararse dos objetos también se retorne true podemos sobreescribir el metodo equals en el caso de que por ejemplo, sean dos objetos diferentes pero con los mismos argumentos.

Una vez usted sobreescibre este metodo. el metodo nuevo sera el que siempre tenga prioridad a la hora de utilizarse.

toString();

Esto esta implementado en la clase Objeto por ende todas las clases lo poseen

Normalmente devuelve una concatenación del nombre completo del objeto y la clase a la que pertenece más un signo @ y un secuencia de digitos con letras (Código Hash)

Si pertenece a un paquete la clase

java.lang.Object@601BB1

Si no pertenece a un paquete devuelve solo el nombre de la clase

Car@1BA34F2

Declara tu propio toString();

Normalmente obtener el tipo de resultados anteriormente citado no es lo que uno desea, por eso podemos sobreescribir este metodo, Clases como Date sobreescriben sus toString() para obtener algo mas coherente, en este caso devuelve devuelve los valores del mes, día, año y segundos de un objeto Date como una cadena simplemente concatenada

Llamadas implicitas

Siempre que utilicemos System.out.printlnoSystem.out.printpara mostrar un objeto la JVM hace una llamada implicita al metodo toString(); de la clase a la cual pertenece objeto.

Polimorfismo y vinculación dinámica

Polimorfismo

Si vamos al significado de la palabra obtenemos "poseer muchas formas", en Java esto se traduce en que diferentes tipos de objetos responden en forma distinta a la llamada de un mismo método.

En pocas palabras es lo que estuvimos haciendo recientemente, reescribir metodos para cada tipo de objeto, en teoría es el mismo metodo pero la jvm decidira que "versión" de este utilizara según el objeto, de modo que el toString(); es polimorfico.

Imagina el caso en que tu tienes un objeto de tipo Objeto y a este le asignas un objeto de tipo Dog, una vez que llames a su metodo toString();la JVM decide utilizar el perteneciente a Dog.

Object objeto;
objeto = new Dog();
System.out.println(Objeto.toString());

Clase Abstracta

En este caso todo funciona porque toString es un metodo que pertenece a la superClase Objeto pero si quisieramos usar otro metodo que no pertenece a la clase Objeto no funcionaria, si queremos usar para otros metodos lo mejor seria declarar una superClase en donde exista el metodo que querramos sobreescribir para cada subclase y asi si funcionaria el polimorfismo

El real uso del Polimorfismo se da en casos donde por ejemplo tenemos arrays de clases que todas heredan de la misma clase pero cada uno tiene su propio metodo sobreescrito

La forma mas elegante de lograr eso seria utilizando clases Abstractas que no tienen suficiente información para definir un metodo, solo especifica su interfaz para que luego en las clases que hereden de el la utilicemos.

Esto se debe expresar de forma explicita

Modificador abstracto

El modificador abstracto posee un nombre adecuado. Algo es abstracto si es de naturaleza general, no detallada. Una declaración de un método abstracto es general por naturaleza. No proporciona los detalles del método. Simplemente notifica que el método existe y que es necesario precisarlo mediante definiciones del método “real” en todas las clases descendientes instanciables.

Ejemplo:

public abstract class Employee{

public abstract double getPay();
// Se necesita declarar el getPay()
}

Recordemos que en estos casos seria un sin sentido utilizar los modificadores final y private porque el objetivo de las clases abstract es poder acceder a lo que esta declarando.

Dinámica Vinculante

Este concepto esta muy conectado con el polimorfismo, el proceso por el cual la JVM decide utilizar el toString() de la clase Dog y no el de Object es por el proceso de "Dinámica Vinculante" por el cual determina su tipo de objeto real y lo vincula con el metodo adecuado.

¿Por que dinámica?

En java este proceso se desarrolla justo antes de ejecutarse el metodo, por eso algunos lo llaman Vinculación tardía, existen lenguajes de programación en donde este proceso se realiza en tiempo de compilación y no de ejecución, a eso se le llama Vinculación estática.

Instanceof();

Si por algún motivo el usuario desease realizar de forma explicita el control de las clases puede hacerlo utilziando el metodo instanceof() que devolveria true si el objeto pertenece a la clase Dog o a una clase que hereda de la clase Dog

Interfaces

Ayuda a cumplir con el objetivo de polimorfismo, una clase puede implementar tantas interfaces como necesite es parecido a la clase Abstracta pero tiene sus diferencias una clase abstracta podria implementar metodos pero la interfaz solo declara los metodos sin nada de implementaciones nunca.

Pensemos en las Interfaces como un contrato de diseño con la nueva clase porque establece metodos que deberan ser implementados, estandariza la comunicación entre clases diferentes.

Otra ventaja que nos da utilizar las interfaces es acceder a constantes universales nombradas que almacena la interfaz.

Gracias a las interfaces podemos acceder a metodos que normalmente no podriamos por medio de herencia convencional

Ir Arriba↑