Constructor de polimorfismo Java
Java es un lenguaje de programación orientado a objetos ya que proporciona a los desarrolladores de Java la capacidad de implementar objetos como entidades de la vida real. La POO (programación orientada a objetos) es un paradigma de programación construido en torno a los objetos y sus propiedades (atributos) y comportamientos (métodos). Por tanto, en general, el diseño de software que utiliza los principios de la orientación a objetos se centra en los objetos y las operaciones. Entre las muchas características de la programación orientada a objetos está la de fomentar la reutilización y la extensibilidad del código. Más adelante explicaremos estos dos términos en detalle. Pero, primero, este artículo explicará dos principios básicos de la POO en la herencia y el polimorfismo.
Imagina que diseñas una clase para crear objetos Coche como Toyota, Benz, Rolls Royce, etc. Todos los objetos coche tienen las mismas propiedades y comportamientos. Por ejemplo, todos los coches pueden moverse (conducir), tocar la bocina, acelerar, y todos tienen un nombre y un número de motor. En lugar de crear estas clases individualmente, se puede utilizar una clase general de coche (superclase) con todos los atributos y comportamientos de un coche para modelar todos los objetos de coche. Las demás clases heredan o se crean basándose en los atributos y métodos de la superclase. En pocas palabras, la herencia le permite construir clases basadas en otras clases y evitar la duplicación y la repetición de código. Aquí hay un poco de código para explicar la ilustración anterior:
Herencia y polimorfismo java
Hay dos maneras de reutilizar las clases existentes, a saber, la composición y la herencia. Con la composición (también conocida como agregación), se define una nueva clase, que se compone de clases existentes. Con la herencia, se deriva una nueva clase basada en una clase existente, con modificaciones o extensiones.
Supongamos que necesitamos una nueva clase llamada Línea, podemos diseñar la clase Línea reutilizando la clase Punto mediante la composición. Decimos que “Una línea está compuesta por dos puntos”, o “Una línea tiene dos puntos”. La composición muestra una relación “tiene-un”.
En POO, a menudo organizamos las clases en jerarquía para evitar la duplicación y reducir la redundancia. Las clases de la jerarquía inferior heredan todas las variables (atributos estáticos) y métodos (comportamientos dinámicos) de las jerarquías superiores. Una clase en la jerarquía inferior se llama subclase (o clase derivada, hija, extendida). Una clase de la jerarquía superior se llama superclase (o clase base, padre). Al extraer todas las variables y métodos comunes en las superclases, y dejar las variables y métodos especializados en las subclases, se puede reducir o eliminar en gran medida la redundancia, ya que estas variables y métodos comunes no necesitan repetirse en todas las subclases. Por ejemplo,
Programación de la herencia en Java
Hasta ahora, para calcular el precio del álbum, se comprueba el tipo de tarifa (NORMAL, REDUCIDA o AUMENTADA) dentro del cuerpo del método getPrice de la clase Album. Dependiendo del tipo de tarifa, llamamos al método getPrice de la clase relacionada: NormalRate, ReducedRate o IncreasedRate.
Para simplificar el código del programa, se puede evitar esta comprobación utilizando un enlace dinámico. Para ello, debe crear un método abstracto getPrice en la clase Rate y modificar el método actual getPrice de la clase Album. Este método devuelve directamente el precio de la clase Rate multiplicado por el número de elementos de la clase Album, sin comprobar el tipo de tarifa. Como estamos invocando un método abstracto en la clase Rate, el entorno de ejecución sabrá en tiempo real cuál es el tipo de objeto al que nos referimos.
objetos que pueden ser comparados entre ellos. Se define el método compareTo() que permite comparar dos objetos. Toda clase cuyos objetos quieran ser comparados, como ya se ha dicho, debe implementar este método. Con una interfaz, el diseño posterior y la reutilización del código se hace fácilmente, ya que todos los objetos comparten el mismo método de comparación y el resultado del mismo.
Ejercicios de polimorfismo en Java
Para ayudar a entender cómo funcionan las clases y los objetos, es útil visualizar cómo se almacenan en la memoria. La semana pasada mencionamos que los datos (por ejemplo, los campos) y el código (por ejemplo, los métodos) se almacenan en dos regiones diferentes de la memoria. Dado que un objeto contiene tanto campos como métodos, ¿dónde guardamos un objeto?
En la figura anterior, hay dos objetos de la misma clase. Se hace referencia a un objeto a través de su referencia, que es un puntero a la ubicación de memoria donde se almacenan los campos de instancia del objeto, junto con un puntero a una tabla de métodos. Una tabla de métodos almacena una tabla de punteros a los métodos, junto con una tabla a los campos de la clase.
Recordemos el concepto de encapsulación. Cuando desarrollamos una gran pieza de software, es importante ocultar los detalles de la representación e implementación de los datos, y sólo exponer ciertos métodos públicos para que los usuarios los utilicen. Podemos imaginar que existe una barrera de abstracción entre el código que implementa las partes internas de una clase (llamado implementador) y el código que utiliza la clase (llamado cliente) para lograr una tarea de nivel superior.