La herencia en Java es uno de los conceptos básicos de la programación orientada a objetos. La herencia en Java se utiliza cuando tenemos una relación de tipo es-a entre objetos. La herencia en Java se implementa mediante extendspalabras clave.
Herencia en Java
La herencia en Java es el método para crear una jerarquía entre clases heredando de otras clases.
La herencia de Java es transitiva, por lo que si Sedan extiende a Car y Car extiende a Vehicle, entonces Sedan también se hereda de la clase Vehicle. Vehicle se convierte en la superclase de Car y Sedan.
La herencia se utiliza ampliamente en aplicaciones Java, por ejemplo, al extender la clase Exception para crear una clase Exception específica de la aplicación que contenga más información, como códigos de error. Por ejemplo, NullPointerException .
Ejemplo de herencia de Java
Cada clase en Java extiende implícitamente java.lang.Objectuna clase. Por lo tanto, la clase Object se encuentra en el nivel superior de la jerarquía de herencia en Java.
Veamos cómo implementar la herencia en Java con un ejemplo simple.
Superclase: Animal
package com.journaldev.inheritance;public class Animal {private boolean vegetarian;private String eats;private int noOfLegs;public Animal(){}public Animal(boolean veg, String food, int legs){this.vegetarian = veg;this.eats = food;this.noOfLegs = legs;}public boolean isVegetarian() {return vegetarian;}public void setVegetarian(boolean vegetarian) {this.vegetarian = vegetarian;}public String getEats() {return eats;}public void setEats(String eats) {this.eats = eats;}public int getNoOfLegs() {return noOfLegs;}public void setNoOfLegs(int noOfLegs) {this.noOfLegs = noOfLegs;}}
Animal es la clase base aquí. Vamos a crear una clase Gato que herede de la clase Animal.
Subclase: Gato
package com.journaldev.inheritance;public class Cat extends Animal{private String color;public Cat(boolean veg, String food, int legs) {super(veg, food, legs);this.color="White";}public Cat(boolean veg, String food, int legs, String color){super(veg, food, legs);this.color=color;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}}
Tenga en cuenta que estamos usando extendspalabras clave para implementar la herencia en Java.
Programa de prueba de herencia de Java
Escribamos una clase de prueba simple para crear un objeto Cat y usar algunos de sus métodos.
package com.journaldev.inheritance;public class AnimalInheritanceTest {public static void main(String[] args) {Cat cat = new Cat(false, "milk", 4, "black");System.out.println("Cat is Vegetarian?" + cat.isVegetarian());System.out.println("Cat eats " + cat.getEats());System.out.println("Cat has " + cat.getNoOfLegs() + " legs.");System.out.println("Cat color is " + cat.getColor());}}
Producción:
La clase Cat no tiene getEats()método, pero aún así, el programa funciona porque se hereda de la clase Animal.
Puntos importantes
-
La reutilización de código es el beneficio más importante de la herencia porque las subclases heredan las variables y los métodos de la superclase.
-
Los miembros privados de la superclase no son directamente accesibles para la subclase. Como en este ejemplo, la variable Animal noOfLegs no es accesible para la clase Cat, pero puede ser accesible indirectamente a través de los métodos getter y setter.
-
Los miembros de la superclase con acceso predeterminado son accesibles para la subclase SÓLO si están en el mismo paquete.
-
Los constructores de superclase no son heredados por las subclases.
-
Si la superclase no tiene un constructor predeterminado, entonces la subclase también debe tener un constructor explícito definido. De lo contrario, se generará una excepción en tiempo de compilación. En el constructor de la subclase, la llamada al constructor de la superclase es obligatoria en este caso y debe ser la primera instrucción en el constructor de la subclase.
-
Java no admite la herencia múltiple ; una subclase solo puede extender una clase. La clase Animal extiende implícitamente la clase Object y Cat extiende la clase Animal, pero debido a la naturaleza transitiva de la herencia de Java, la clase Cat también extiende la clase Object.
-
Podemos crear una instancia de una subclase y luego asignarla a una variable de la superclase, esto se denomina conversión ascendente . A continuación, se muestra un ejemplo simple de conversión ascendente:
Cat c = new Cat(); //subclass instanceAnimal a = c; //upcasting, it's fine since Cat is also an Animal -
Cuando se asigna una instancia de Superclass a una variable de Subclass, se denomina conversión descendente . Necesitamos convertir esto explícitamente a Subclass. Por ejemplo:
Cat c = new Cat();Animal a = c;Cat c1 = (Cat) a; //explicit casting, works fine because "c" is actually of type CatTenga en cuenta que el compilador no se quejará incluso si lo hacemos mal, debido a la conversión explícita. A continuación, se muestran algunos de los casos en los que se generará una excepción
ClassCastExceptionen tiempo de ejecución.Dog d = new Dog();Animal a = d;Cat c1 = (Cat) a; //ClassCastException at runtimeAnimal a1 = new Animal();Cat c2 = (Cat) a1; //ClassCastException because a1 is actually of type Animal at runtime -
Podemos anular el método de la superclase en la subclase. Sin embargo, siempre debemos anotar el método anulado con la anotación @Override . El compilador sabrá que estamos anulando un método y, si algo cambia en el método de la superclase, obtendremos un error en tiempo de compilación en lugar de obtener resultados no deseados en tiempo de ejecución.
-
Podemos llamar a los métodos de la superclase y acceder a las variables de la superclase usando la palabra clave super . Esto resulta útil cuando tenemos la misma variable o método en la subclase, pero queremos acceder a la variable o método de la superclase. Esto también se utiliza cuando se definen constructores en la superclase y la subclase y tenemos que llamar explícitamente al constructor de la superclase.
-
Podemos usar
instanceofinstrucciones para comprobar la herencia entre objetos, veámoslo con el siguiente ejemplo.
```Cat c = new Cat();Dog d = new Dog();Animal an = c;boolean flag = c instanceof Cat; //normal case, returns trueflag = c instanceof Animal; // returns true since c is-an Animal tooflag = an instanceof Cat; //returns true because a is of type Cat at runtimeflag = an instanceof Dog; //returns false for obvious reasons.```
- No podemos extender las clases Finales en Java.
- Si no va a utilizar una superclase en el código, es decir, su superclase es solo una base para guardar código reutilizable, puede mantenerla como una clase abstracta para evitar la creación de instancias innecesarias por parte de clases cliente. También restringirá la creación de instancias de la clase base.
Tutorial en vídeo sobre la herencia de Java
Recientemente he publicado dos vídeos en YouTube que explican la herencia en detalle con programas de muestra, deberías verlos a continuación.
Puede consultar más ejemplos de herencia en nuestro repositorio de GitHub .
Referencia: Documentación de Oracle