Lenguajes de Programación

Introducción a POO en Java: Herencia y polimorfismo

Si te has sentido limitado por las restricciones de un código rígido y repetitivo, la herencia y el polimorfismo en Java son la llave para liberar tu potencial creativo. Estos conceptos no solo simplifican tu código, sino que lo hacen más adaptable y reutilizable. Descubre aquí cómo aplicar estas técnicas para escribir un código más limpio, eficiente y escalable.

Publicado el 17 de Noviembre de 2023
Compartir

Introducción

Bienvenido a este artículo en el que exploraremos las profundidades de la Programación Orientada a Objetos (POO) en el contexto del versátil lenguaje de programación Java. Vamos a poner el foco en dos conceptos clave que enriquecen y dinamizan nuestro código: la herencia y el polimorfismo.

Exploraremos en detalle estos dos conceptos vitales, descubriendo cómo aplicarlos de manera efectiva. Veremos ejemplos prácticos, entenderemos las ventajas que ofrecen y exploraremos técnicas para implementarlos en nuestro día a día.

¡Comienza la exploración de la herencia y el polimorfismo!


Introducción a la Programación Orientada a Objetos

La Programación Orientada a Objetos (POO) es un paradigma de programación que se basa en la idea de organizar el código en “objetos”, que son como piezas individuales de un rompecabezas. Cada objeto tiene sus propios datos (llamados atributos) y comportamientos (llamados métodos).

En POO, vemos el mundo desde una perspectiva de objetos. Cada objeto representa una instancia única de una “clase”. Una clase es un plano o plantilla que define la estructura y el comportamiento de los objetos que se pueden crear a partir de ella. Los objetos, por lo tanto, son instancias concretas de estas clases.

La POO nos ayuda a organizar nuestro código de manera más intuitiva y modular. Podemos dividir nuestro programa en clases, cada una responsable de una parte específica de la funcionalidad. Además, fomenta la reutilización de código y nos permite modelar conceptos del mundo real de una manera cercana a cómo los entendemos.

Te recordamos que este artículo no es el primero que dedicamos a este paradigma de Java. Si quieres leerlos en orden y desde el principio, aquí tienes los enlaces: POO en Java: Objetos y clases, POO en Java: Atributos y constructores, POO en Java: Encapsulamiento.

Qué es la herencia en Java

La herencia, en términos simples, es como construir a partir de cimientos ya existentes. Imagina que tienes un conjunto de piezas de LEGO y decides crear una nueva estructura utilizando algunas de estas piezas.

La herencia en la programación sigue un principio similar, permitiéndote definir nuevas clases basadas en clases previamente existentes, aprovechando y extendiendo su funcionalidad. Así, puedes ahorrar tiempo y esfuerzo al reutilizar código ya probado y adaptarlo a tus necesidades, proporcionando una base sólida para tu programa.

Ventajas de la herencia

La herencia en Programación Orientada a Objetos (POO) ofrece varias ventajas que contribuyen a la organización, reutilización y extensibilidad del código.

  • Reutilización de código: Permite que las clases hereden atributos y métodos de una clase base. Esto significa que puedes reutilizar funcionalidades comunes y evitar la duplicación de código.
  • Facilita la extensibilidad: Puedes extender una clase existente para crear una nueva clase que herede todas las características de la clase base y luego agregar o modificar sus propias características. Esta flexibilidad facilita la adaptación y extensión del software a medida que los requisitos cambian o evolucionan.
  • Promueve la coherencia y consistencia: Al agrupar características comunes en una clase base, garantizas que todas las clases derivadas mantengan una estructura y comportamiento coherentes. Esto facilita la administración del código y mantiene una organización lógica y consistente en la jerarquía de clases.
  • Facilita la implementación de relaciones “es un”: La herencia permite modelar relaciones “es un” entre las clases. Por ejemplo, si tienes una clase “Animal”, puedes derivar clases más específicas como “Perro”, “Gato”, etc., que son tipos de animales. Esto refleja las relaciones de herencia naturales en el mundo real.
  • Abstracción y generalización: Al identificar características comunes en clases relacionadas, puedes abstraer estas características en una clase base que capture la esencia común de esas clases. Esto fomenta la generalización y ayuda a comprender y organizar mejor el código.
Conviértete en un Backend Developer
Domina los lenguajes de programación más demandados. Accede a cursos, talleres y laboratorios para crear proyectos con Java, Python, PHP, Microsoft .NET y más
Comenzar gratis ahora

Qué es el polimorfismo en Java

El polimorfismo es la capacidad de un objeto para adquirir múltiples formas o comportamientos. Volviendo a nuestra analogía LEGO, es como tener una pieza que puede encajar en varios lugares o tener varios usos según el contexto.

En la programación, esto se traduce en la habilidad de una clase para implementar métodos con el mismo nombre pero con comportamientos distintos, dependiendo de la clase específica con la que se esté interactuando. Esto añade flexibilidad y extensibilidad a tu código, permitiendo adaptarse a diferentes situaciones y requerimientos.

Ventajas del polimorfismo

El polimorfismo es un concepto fundamental en Programación Orientada a Objetos (POO) que brinda varias ventajas importantes para el desarrollo de software.

  • Permite que los objetos se comporten de diferentes maneras según el contexto en el que se utilicen. Esto proporciona flexibilidad en el diseño y la implementación del código, permitiendo adaptarse a diferentes situaciones.
  • Simplicidad y claridad del código: Al utilizar interfaces o clases base abstractas que definen un conjunto común de métodos, el polimorfismo ayuda a simplificar la lógica del código. Esto mejora la legibilidad y la claridad, ya que se centra en lo que un objeto hace, no en los detalles de cómo lo hace.
  • Permite la expansión de funcionalidades: Se pueden agregar nuevas clases que implementen una interfaz o hereden de una clase base abstracta existente. Esto significa que puedes expandir la funcionalidad del programa sin modificar el código existente.
  • Fomenta la desacoplación y la modularidad: Al utilizar interfaces y clases abstractas, el código se vuelve menos dependiente de implementaciones concretas. Esto promueve una menor interconexión entre componentes, lo que conduce a sistemas más modulares y desacoplados.

Cómo implementar la herencia en Java

En Java, la herencia se implementa utilizando la palabra clave extends. Aquí te explico cómo implementarla paso a paso:

- Definición de la superclase

Comienza definiendo una clase base, también llamada superclase, que contiene los atributos y métodos comunes que deseas compartir con las clases derivadas.

public class Animal {
    String nombre;
    public void comer() {
       System.out.println("El animal está comiendo.");
    }
}

- Creación de la clase derivada

Luego, crea una nueva clase que herede de la clase base usando la palabra clave extends.

public class Perro extends Animal {
    public void ladrar() {
        System.out.println("El perro está ladrando.");
    }
}
  1. Utilización de la herencia: Ahora puedes crear objetos de la clase derivada y acceder a los atributos y métodos tanto de la clase derivada como de la clase base.
public class Main {
    public static void main(String[] args) {
        Perro miPerro = new Perro();
        miPerro.nombre = "Bobby";
        miPerro.comer();  // Método de la clase base
        miPerro.ladrar(); // Método de la clase derivada
    }
}

En este ejemplo, la clase Perro hereda de la clase Animal, por lo que un objeto de la clase Perro también puede acceder a los métodos y atributos de la clase Animal. La herencia permite compartir y reutilizar funcionalidades comunes.

Cómo lograr el polimorfismo en Java

El polimorfismo es un concepto importante en la Programación Orientada a Objetos (POO) que permite que los objetos de diferentes clases respondan a un mismo mensaje de manera específica para cada uno. En Java, el polimorfismo se logra mediante el uso de herencia y la implementación de interfaces.

- Crear una clase base o una interfaz

Debes tener una clase base o una interfaz que defina los métodos que deseas que las clases derivadas implementen de manera específica. Por ejemplo:

public interface Animal {
   void hacerSonido();
}

- Implementar la clase base o la interfaz

Luego, crea clases concretas que implementen la interfaz o hereden de la clase base. Cada una de estas clases debe proporcionar su propia implementación del método definido en la interfaz o clase base.

public class Perro implements Animal {
    public void hacerSonido() {
        System.out.println("El perro ladra.");
    }
}

public class Gato implements Animal {
    public void hacerSonido() {
        System.out.println("El gato maulla.");
    }
}

- Utilizar polimorfismo

Ahora puedes crear objetos de las clases derivadas y tratarlos como objetos de la interfaz o clase base. Esto significa que puedes llamar al método común hacerSonido() sin saber la implementación específica de la clase.

public class Main {
    public static void main(String[] args) {
        Animal miMascota = new Perro();
        miMascota.hacerSonido(); // Llama al método del perro

        miMascota = new Gato();
        miMascota.hacerSonido(); // Llama al método del gato
    }
}

En este ejemplo, creamos objetos Perro y Gato, los asignamos a una referencia de tipo Animal y llamamos al método hacerSonido() sin preocuparnos por la implementación real de cada clase. Esto es el polimorfismo en acción: objetos de diferentes clases responden al mismo mensaje (hacerSonido()) de manera específica para cada uno.

Ejemplos prácticos de herencia y polimorfismo

Supongamos que estamos creando un programa para modelar diferentes tipos de vehículos. Podemos tener una clase base Vehiculo`y luego crear clases derivadas como Coche y Bicicleta.

class Vehiculo {
    public void mover() {
        System.out.println("El vehículo se está moviendo.");
    }
}

class Coche extends Vehiculo {
    public void mover() {
        System.out.println("El coche se está desplazando por la carretera.");
    }
}

class Bicicleta extends Vehiculo {
    public void mover() {
        System.out.println("La bicicleta se está pedaleando en el carril.");
    }
}

public class Main {
    public static void main(String[] args) {
        Vehiculo miVehiculo = new Coche();
        miVehiculo.mover();  // Llama al método de Coche

        miVehiculo = new Bicicleta();
        miVehiculo.mover();  // Llama al método de Bicicleta
    }
}

Siguiendo con el ejemplo anterior, ahora vamos a aplicar polimorfismo para mostrar cómo diferentes vehículos pueden responder al mismo mensaje de manera específica.

public class Main {
    public static void main(String[] args) {
        Vehiculo[] misVehiculos = new Vehiculo[2];
        misVehiculos[0] = new Coche();
        misVehiculos[1] = new Bicicleta();

        for (Vehiculo vehiculo : misVehiculos) {
            vehiculo.mover();
        }
    }
}

En este caso, estamos utilizando un arreglo de Vehiculo para almacenar tanto coches como bicicletas. Cuando llamamos al método mover(), cada tipo de vehículo responde de manera específica según su implementación.

Mejora las habilidades de tus desarrolladores
Acelera la formación tecnológica de tus equipos con OpenWebinars. Desarrolla tu estrategia de atracción, fidelización y crecimiento de tus profesionales con el menor esfuerzo.
Solicitar más información

Conclusiones

En este artículo, hemos explorado a fondo dos conceptos cruciales en la POO: la herencia y el polimorfismo.

La Programación Orientada a Objetos (POO) nos permite organizar nuestro código de forma intuitiva y modular, viendo el mundo desde una perspectiva de objetos, cada uno representando una instancia única de una “clase”.

La herencia nos permite construir nuevas clases basadas en clases existentes, facilitando la reutilización y extensión del código. Por otro lado, el polimorfismo otorga a los objetos la capacidad de comportarse de diversas maneras según el contexto, aportando flexibilidad y simplicidad al código.

Hemos mostrado cómo estos conceptos de herencia y polimorfismo pueden aplicarse en un ejemplo práctico modelando diferentes tipos de vehículos, brindando una visión completa y detallada de su implementación y beneficios en el desarrollo de software.

Lo que deberías recordar de la herencia y el polimorfismo en Java

  • La POO organiza el código en objetos con atributos y métodos.
  • La herencia permite crear nuevas clases basadas en clases existentes, reutilizando código y extendiendo funcionalidades.
  • Ventajas de la herencia: reutilización de código, extensibilidad, coherencia en la estructura de clases y modelado de relaciones “es un”.
  • El polimorfismo permite que los objetos respondan de diferentes maneras según el contexto.
  • Ventajas del polimorfismo: flexibilidad en el diseño, simplicidad y claridad del código, expansión de funcionalidades y desacoplamiento.
  • La herencia en Java se implementa con la palabra clave “extends”, permitiendo compartir funcionalidades comunes.
  • El polimorfismo se logra mediante herencia e implementación de interfaces.

Compartir este post

También te puede interesar...

Java desde 0: Orientación a Objetos

Java desde 0: Orientación a Objetos

6 horas y 41 minutos · Curso

En esta formación veremos como crear una aplicación Java utilizando el paradigma de Orientación a Objetos, conociendo las diferentes funcionalidades que ofrece el lenguaje y …

  • Lenguajes de programación
Java desde 0: Introducción

Java desde 0: Introducción

6 horas y 13 minutos · Curso

Con esta formación aprenderás a crear una aplicación Java desde cero, conociendo los fundamentos más importantes del lenguaje de programación y aplicándolos para resolver ejercicios …

  • Lenguajes de programación
Tecnología

Frameworks Java para un desarrollo eficiente

01 Noviembre 2023 Pablo Huet
Artículos
Ver todos