logo

Herencia en Java

Java, la herencia es un pilar importante de la POO (programación orientada a objetos). Es el mecanismo en Java mediante el cual se permite a una clase heredar las características (campos y métodos) de otra clase. En Java, herencia significa crear nuevas clases basadas en las existentes. Una clase que hereda de otra clase puede reutilizar los métodos y campos de esa clase. Además, también puedes agregar nuevos campos y métodos a tu clase actual.

¿Por qué necesitamos la herencia de Java?

  • Reutilización del código: El código escrito en la Superclase es común a todas las subclases. Las clases secundarias pueden usar directamente el código de la clase principal.
  • Anulación de método: Anulación de métodos sólo se puede lograr mediante la herencia. Es una de las formas en que Java logra el polimorfismo en tiempo de ejecución.
  • Abstracción: El concepto de resumen en el que no tenemos que proporcionar todos los detalles se logra mediante la herencia. Abstracción solo muestra la funcionalidad al usuario.

Terminologías importantes utilizadas en la herencia de Java

  • Clase: Una clase es un conjunto de objetos que comparten características/comportamiento y propiedades/atributos comunes. La clase no es una entidad del mundo real. Es simplemente una plantilla, plano o prototipo a partir del cual se crean los objetos.
  • Superclase/clase para padres: La clase cuyas características se heredan se conoce como superclase (o clase base o clase padre).
  • Subclase/clase secundaria: La clase que hereda la otra clase se conoce como subclase (o clase derivada, clase extendida o clase secundaria). La subclase puede agregar sus propios campos y métodos además de los campos y métodos de la superclase.
  • Reutilizabilidad: La herencia respalda el concepto de reutilización, es decir, cuando queremos crear una nueva clase y ya existe una clase que incluye parte del código que queremos, podemos derivar nuestra nueva clase a partir de la clase existente. Al hacer esto, estamos reutilizando los campos y métodos de la clase existente.

¿Cómo utilizar la herencia en Java?

El extiende la palabra clave se utiliza para la herencia en Java. El uso de la palabra clave extends indica que deriva de una clase existente. En otras palabras, extiende se refiere a una mayor funcionalidad.



Sintaxis:

class DerivedClass extends BaseClass  {   //methods and fields  }>

Herencia en el ejemplo de Java

Ejemplo: En el siguiente ejemplo de herencia, la clase Bicycle es una clase base, la clase MountainBike es una clase derivada que extiende la clase Bicycle y la clase Test es una clase de controlador para ejecutar el programa.

Java
// Java program to illustrate the // concept of inheritance // base class class Bicycle {  // the Bicycle class has two fields  public int gear;  public int speed;  // the Bicycle class has one constructor  public Bicycle(int gear, int speed)  {  this.gear = gear;  this.speed = speed;  }  // the Bicycle class has three methods  public void applyBrake(int decrement)  {  speed -= decrement;  }  public void speedUp(int increment)  {  speed += increment;  }  // toString() method to print info of Bicycle  public String toString()  {  return ('No of gears are ' + gear + '
'  + 'speed of bicycle is ' + speed);  } } // derived class class MountainBike extends Bicycle {  // the MountainBike subclass adds one more field  public int seatHeight;  // the MountainBike subclass has one constructor  public MountainBike(int gear, int speed,  int startHeight)  {  // invoking base-class(Bicycle) constructor  super(gear, speed);  seatHeight = startHeight;  }  // the MountainBike subclass adds one more method  public void setHeight(int newValue)  {  seatHeight = newValue;  }  // overriding toString() method  // of Bicycle to print more info  @Override public String toString()  {  return (super.toString() + '
seat height is '  + seatHeight);  } } // driver class public class Test {  public static void main(String args[])  {  MountainBike mb = new MountainBike(3, 100, 25);  System.out.println(mb.toString());  } }>

Producción
No of gears are 3 speed of bicycle is 100 seat height is 25>

En el programa anterior, cuando se crea un objeto de la clase MountainBike, una copia de todos los métodos y campos de la superclase adquiere memoria en este objeto. Es por eso que al utilizar el objeto de la subclase también podemos acceder a los miembros de una superclase.



Tenga en cuenta que durante la herencia sólo se crea el objeto de la subclase, no la superclase. Para obtener más información, consulte Creación de objetos Java de clase heredada .

Ejemplo 2: En el siguiente ejemplo de herencia, la clase Empleado es una clase base, la clase Ingeniero es una clase derivada que extiende la clase Empleado y la clase Prueba es una clase de controlador para ejecutar el programa.

Java
// Java Program to illustrate Inheritance (concise) import java.io.*; // Base or Super Class class Employee {  int salary = 60000; } // Inherited or Sub Class class Engineer extends Employee {  int benefits = 10000; } // Driver Class class Gfg {  public static void main(String args[])  {  Engineer E1 = new Engineer();  System.out.println('Salary : ' + E1.salary  + '
Benefits : ' + E1.benefits);  } }>

Producción
Salary : 60000 Benefits : 10000>

Imagen ilustrativa del programa:



Herencia en Java

En la práctica, la herencia y polimorfismo se utilizan juntos en Java para lograr un rendimiento rápido y legibilidad del código.

Tipos de herencia de Java

A continuación se muestran los diferentes tipos de herencia admitidos por Java.

  1. Herencia única
  2. Herencia multinivel
  3. Herencia jerárquica
  4. Herencia múltiple
  5. Herencia híbrida

1. Herencia única

En la herencia única, una subclase se deriva de una sola superclase. Hereda las propiedades y el comportamiento de una clase monoparental. En ocasiones, también se la conoce como herencia simple. En la siguiente figura, 'A' es una clase principal y 'B' es una clase secundaria. La clase 'B' hereda todas las propiedades de la clase 'A'.

cadena java a int
herencia única

herencia única

Java
// Java program to illustrate the // concept of single inheritance import java.io.*; import java.lang.*; import java.util.*; // Parent class class One {  public void print_geek()  {  System.out.println('Geeks');  } } class Two extends One {  public void print_for() { System.out.println('for'); } } // Driver class public class Main {  // Main function  public static void main(String[] args)  {  Two g = new Two();  g.print_geek();  g.print_for();  g.print_geek();  } }>

Producción
Geeks for Geeks>

2. Herencia multinivel

En la herencia multinivel, una clase derivada heredará una clase base y, además de la clase derivada, también actúa como clase base para otras clases. En la imagen siguiente, la clase A sirve como clase base para la clase derivada B, que a su vez sirve como clase base para la clase derivada C. En Java, una clase no puede acceder directamente a la clase derivada. miembros de los abuelos .

Herencia multinivel

Herencia multinivel

Java
// Importing required libraries import java.io.*; import java.lang.*; import java.util.*; // Parent class One class One {  // Method to print 'Geeks'  public void print_geek() {  System.out.println('Geeks');  } } // Child class Two inherits from class One class Two extends One {  // Method to print 'for'  public void print_for() {  System.out.println('for');  } } // Child class Three inherits from class Two class Three extends Two {  // Method to print 'Geeks'  public void print_lastgeek() {  System.out.println('Geeks');  } } // Driver class public class Main {  public static void main(String[] args) {  // Creating an object of class Three  Three g = new Three();    // Calling method from class One  g.print_geek();    // Calling method from class Two  g.print_for();    // Calling method from class Three  g.print_lastgeek();  } }>

Producción
Geeks for Geeks>

3. Herencia jerárquica

En la herencia jerárquica, una clase sirve como superclase (clase base) para más de una subclase. En la imagen siguiente, la clase A sirve como clase base para las clases derivadas B, C y D.

Herencia-jerárquica-en-Java

Java
// Java program to illustrate the // concept of Hierarchical inheritance class A {  public void print_A() { System.out.println('Class A'); } } class B extends A {  public void print_B() { System.out.println('Class B'); } } class C extends A {  public void print_C() { System.out.println('Class C'); } } class D extends A {  public void print_D() { System.out.println('Class D'); } } // Driver Class public class Test {  public static void main(String[] args)  {  B obj_B = new B();  obj_B.print_A();  obj_B.print_B();  C obj_C = new C();  obj_C.print_A();  obj_C.print_C();  D obj_D = new D();  obj_D.print_A();  obj_D.print_D();  } }>

Producción
Class A Class B Class A Class C Class A Class D>

4. Herencia múltiple ( A través de interfaces)

En Herencias múltiples , una clase puede tener más de una superclase y heredar características de todas las clases principales. Tenga en cuenta que Java no no apoyo herencias múltiples con clases. En Java, podemos lograr herencias múltiples solo a través de Interfaces . En la imagen siguiente, la Clase C se deriva de las interfaces A y B.

Herencia múltiple

Herencia múltiple

Java
// Java program to illustrate the // concept of Multiple inheritance import java.io.*; import java.lang.*; import java.util.*; interface One {  public void print_geek(); } interface Two {  public void print_for(); } interface Three extends One, Two {  public void print_geek(); } class Child implements Three {  @Override public void print_geek()  {  System.out.println('Geeks');  }  public void print_for() { System.out.println('for'); } } // Drived class public class Main {  public static void main(String[] args)  {  Child c = new Child();  c.print_geek();  c.print_for();  c.print_geek();  } }>

Producción
Geeks for Geeks>

5. Herencia híbrida

Es una combinación de dos o más de los tipos de herencia anteriores. Dado que Java no admite herencias múltiples con clases, la herencia híbrida que implica herencia múltiple tampoco es posible con clases. En Java, podemos lograr la herencia híbrida solo a través de Interfaces si queremos involucrar herencia múltiple para implementar la herencia híbrida.
Sin embargo, es importante señalar que la herencia híbrida no necesariamente requiere el uso exclusivo de la herencia múltiple. Se puede lograr mediante una combinación de herencia multinivel y herencia jerárquica con clases, herencia jerárquica y única con clases. Por lo tanto, es posible implementar la herencia híbrida utilizando únicamente clases, sin depender de múltiples tipos de herencia.

Herencia híbrida

Herencia híbrida

Java ES-Un tipo de relación

IS-A es una forma de decir: Este objeto es un tipo de ese objeto. Veamos cómo se utiliza la palabra clave extends para lograr la herencia.

Java
public class SolarSystem { } public class Earth extends SolarSystem { } public class Mars extends SolarSystem { } public class Moon extends Earth { }>

Ahora, según el ejemplo anterior, en términos orientados a objetos, lo siguiente es cierto:

  • SolarSystem es la superclase de la clase Tierra.
  • SolarSystem es la superclase de la clase Mars.
  • La Tierra y Marte son subclases de la clase SolarSystem.
  • La Luna es la subclase de las clases Tierra y Sistema Solar.
Java
class SolarSystem { } class Earth extends SolarSystem { } class Mars extends SolarSystem { } public class Moon extends Earth {  public static void main(String args[])  {  SolarSystem s = new SolarSystem();  Earth e = new Earth();  Mars m = new Mars();  System.out.println(s instanceof SolarSystem);  System.out.println(e instanceof Earth);  System.out.println(m instanceof SolarSystem);  } }>

Producción
true true true>

¿Qué se puede hacer en una subclase?

En las subclases podemos heredar miembros tal cual, reemplazarlos, ocultarlos o complementarlos con nuevos miembros:

  • Los campos heredados se pueden utilizar directamente, como cualquier otro campo.
  • Podemos declarar nuevos campos en la subclase que no están en la superclase.
  • Los métodos heredados se pueden utilizar directamente tal como están.
  • Podemos escribir un nuevo instancia método en la subclase que tiene la misma firma que el de la superclase, por lo tanto primordial (como en el ejemplo anterior, Encadenar() método se anula).
  • Podemos escribir un nuevo estático método en la subclase que tiene la misma firma que el de la superclase, por lo tanto ocultación él.
  • Podemos declarar nuevos métodos en la subclase que no están en la superclase.
  • Podemos escribir un constructor de subclase que invoque al constructor de la superclase, ya sea implícitamente o usando la palabra clave súper .

Ventajas de la herencia en Java:

  1. Reutilización del código: la herencia permite la reutilización del código y reduce la cantidad de código que debe escribirse. La subclase puede reutilizar las propiedades y métodos de la superclase, reduciendo la duplicación de código.
  2. Abstracción: la herencia permite la creación de clases abstractas que definen una interfaz común para un grupo de clases relacionadas. Esto promueve la abstracción y la encapsulación, lo que hace que el código sea más fácil de mantener y ampliar.
  3. Jerarquía de clases: la herencia permite la creación de una jerarquía de clases, que se puede utilizar para modelar objetos del mundo real y sus relaciones.
  4. Polimorfismo: la herencia permite el polimorfismo, que es la capacidad de un objeto de adoptar múltiples formas. Las subclases pueden anular los métodos de la superclase, lo que les permite cambiar su comportamiento de diferentes maneras.

Desventajas de la herencia en Java:

  1. Complejidad: la herencia puede hacer que el código sea más complejo y más difícil de entender. Esto es especialmente cierto si la jerarquía de herencia es profunda o si se utilizan herencias múltiples.
  2. Acoplamiento estrecho: la herencia crea un acoplamiento estrecho entre la superclase y la subclase, lo que dificulta realizar cambios en la superclase sin afectar a la subclase.

Conclusión

Veamos algunos puntos importantes del artículo que se mencionan a continuación:

  • Superclase predeterminada : Excepto Objeto clase, que no tiene superclase, cada clase tiene una y sólo una superclase directa (herencia única). En ausencia de cualquier otra superclase explícita, cada clase es implícitamente una subclase de la clase Objeto.
  • La superclase solo puede ser una: Una superclase puede tener cualquier número de subclases. Pero una subclase sólo puede tener uno superclase. Esto se debe a que Java no admite herencias múltiples con clases. Aunque con interfaces, Java admite múltiples herencias.
  • Constructores herederos: Una subclase hereda todos los miembros (campos, métodos y clases anidadas) de su superclase. Los constructores no son miembros, por lo que las subclases no los heredan, pero el constructor de la superclase puede invocarse desde la subclase.
  • Herencia de miembros privados: Una subclase no hereda los miembros privados de su clase padre. Sin embargo, si la superclase tiene métodos públicos o protegidos (como captadores y definidores) para acceder a sus campos privados, la subclase también puede utilizarlos.

Preguntas frecuentes sobre herencia

1. ¿Qué es la herencia de Java?

La herencia es un concepto de programación orientada a objetos en el que una clase hereda de otra clase que puede reutilizar los métodos y campos de la clase principal.

2. ¿Cuáles son los 4 tipos de herencia en Java?

Los hay únicos, múltiples, multinivel, jerárquicos e híbridos.

3. ¿Para qué sirve la palabra clave extender?

La palabra clave extender se utiliza para heredar una clase a otra.

4. ¿Cuál es un ejemplo de herencia en Java?

A continuación se menciona un ejemplo del mundo real de herencia en Java:

Considere un grupo de vehículos. Necesita crear clases para autobús, automóvil y camión. Los métodos fuelAmount(), capacidad(), applyBrakes() serán los mismos para las tres clases.

Referencias utilizadas:

  1. Head First Java por Kathy Sierra y Bert Bates
  2. Java: una guía para principiantes por Herbert Schildt
  3. Java: la referencia completa por Herbert Schildt
  4. Java efectivo por Joshua Bloch
  5. Java: las partes buenas de Jim Waldo.