13.1 Herencia y polimorfismo en Java: concepto de herencia
La herencia es uno de los pilares fundamentales de la programación orientada a objetos (POO), y Java, al ser un lenguaje que adopta este paradigma, ofrece recursos robustos para su implementación. La herencia es un mecanismo que permite que una nueva clase derive propiedades y comportamientos de una clase existente. La clase que se hereda se denomina clase base, superclase o clase principal, mientras que la clase que se hereda se conoce como clase derivada, subclase o clase secundaria.
En la práctica, la herencia permite reutilizar el código y crear una jerarquía de clases relacionadas. Esto no sólo ahorra tiempo y esfuerzo en el desarrollo de software, sino que también ayuda a mantener el código organizado, más fácil de mantener y expandir.
Cómo funciona la herencia en Java
En Java, la herencia se realiza con la palabra clave extends
. Cuando una clase se define como la extensión de otra, hereda todos los campos (atributos) y métodos no privados de la clase principal. Esto significa que la clase hija puede usar estos miembros como propios.
Ejemplo:
clase Vehículo { marca de cadena protegida = "Ford"; // atributo de clase de vehículo public void bocina() { // Método de clase de vehículo System.out.println("¡Tuut, tuut!"); } } clase Coche extiende Vehículo { cadena privada modelName = "Mustang"; // atributo de clase de coche público estático vacío principal (String [] argumentos) { // Crea un objeto de la clase Car Coche miCoche = coche nuevo(); // Llama al método de clase Vehículo miCoche.honk(); // Accede al atributo Clase de vehículo System.out.println(myCar.brand + " " + myCar.modelName); } }
En este ejemplo, Car
es una subclase de Vehicle
. La clase Car
hereda el método honk
y el atributo brand
de la clase Vehicle
y también define su propio atributo. ,
Anulación de método
Una subclase en Java puede anular los métodos de la superclase. Esto se hace cuando la subclase necesita una implementación específica para un método heredado. El superíndice es una forma de polimorfismo, que se analizará más adelante.
Ejemplo:
clase animal { sonido público vacío() { System.out.println("El animal emite un sonido"); } } clase Cerdo extiende Animal { sonido público vacío() { System.out.println("El cerdo dice: pipí"); } } clase principal { público estático vacío principal (String [] argumentos) { Animal miAnimal = nuevo Animal(); // Crea un objeto de la clase Animal Animal miCerdo = nuevo Cerdo(); // Crea un objeto de la clase Pig miAnimal.sonido(); miPig.sonido(); } }
En este ejemplo, la clase Pig
anula el método sound
de la clase Animal
. Cuando se llama al método en el objeto myPig
, se utiliza la implementación de la clase Pig
, no la de la clase Animal
.
Usando super
La palabra clave super
en Java se utiliza dentro de los métodos de subclase para referirse a miembros (métodos o atributos) de la superclase. Esto es especialmente útil cuando anulamos métodos pero aún queremos acceder a la implementación de la superclase.
Ejemplo:
clase animal { sonido público vacío() { System.out.println("El animal emite un sonido"); } } clase Cerdo extiende Animal { sonido público vacío() { super.sonido(); // Llama al método de superclase System.out.println("El cerdo dice: pipí"); } }
Aquí, la clase Pig
llama al método sound
de la superclase Animal
antes de ejecutar su propio código.
Polimorfismo en Java
El polimorfismo, otro pilar de la programación orientada a objetos, permite que objetos de diferentes clases sean tratados como objetos de una superclase común. Esto es particularmente poderoso en combinación con la herencia, ya que permite que un único método o clase opere en objetos de diferentes clases.
El polimorfismo en Java se logra, en su mayor parte, mediante la sobrecarga y anulación de métodos. La sobrecarga ocurre cuando dos o más métodos de la misma clase tienen el mismo nombre pero parámetros diferentes. La anulación, como hemos visto, ocurre cuando una subclase proporciona una implementación específica para un método que ya proporciona su superclase.
Ejemplo de polimorfismo:
clase animal { sonido público vacío() { System.out.println("El animal emite un sonido"); } } clase Cerdo extiende Animal { sonido público vacío() { System.out.println("El cerdo dice: pipí"); } } clase Perro extiende Animal { sonido público vacío() { System.out.println("El perro dice: guau"); } }clase principal { público estático vacío principal (String [] argumentos) { Animal miAnimal = nuevo Animal(); Animal miCerdo = nuevo Cerdo(); Animal miPerro = nuevo Perro(); miAnimal.sonido(); miPig.sonido(); miPerro.sonido(); } }
En este ejemplo, la clase Main
crea objetos de diferentes tipos, pero todos se tratan como instancias de la clase Animal
. Esto demuestra polimorfismo, ya que el método sound
se comporta de manera diferente según el tipo de objeto que lo invoca.
Conclusión
La herencia y el polimorfismo son conceptos clave en la programación orientada a objetos y se utilizan ampliamente en Java para crear código reutilizable y sistemas extensibles. Al comprender y aplicar estos conceptos, los desarrolladores pueden escribir código más limpio, más modular y más fácil de mantener.
Se espera que este curso de Java le brinde una comprensión sólida de estos conceptos, lo que le permitirá aplicarlos en escenarios del mundo real y crear aplicaciones sólidas y eficientes.