English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Control de flujo de Java

Arreglo de Java

Java Orientado a Objetos (I)

Java Orientado a Objetos (II)

Java Orientado a Objetos (III)

Manejo de excepciones en Java

Lista de Java

Java Queue (cola)

Conjuntos de Mapa de Java

Conjuntos de Java

Entrada y salida de Java (I/O)

Lector de Java/Writer

Otras temáticas de Java

Herencia en Java

En este tutorial, aprenderemos la herencia en Java a través de ejemplos.

La herencia es una de las funciones importantes del OOP (Programación Orientada a Objetos), que nos permite definir una nueva clase a partir de una clase existente. Por ejemplo,

clase Animal
{
    // método eat()
    // método sleep()
}
class Dog extends Animal
{
    // método bark()
}

En Java, usamos la clave extends para heredar de una clase. Aquí, heredamos la clase Dog de la clase Animal.

Animal es la superclase (clase padre o clase base), y Dog es la subclase (clase hija o derivada). La subclase hereda los campos y métodos de la superclase.

es-una relación

La herencia eses-arelación, solo cuando dos clases existen entre-una relación cuando usamos herencia.

Aquí hay algunos ejemplos:

  • El coche es un vehículo.

  • La naranja es una fruta.

  • El cirujano es un médico.

  • El perro es un animal.

Ejemplo1:herencia Java

class Animal {
   public void comer() {
      System.out.println("Puedo comer");
   }
   public void dormir() {
      System.out.println("Puedo dormir");
   }
}
class Dog extends Animal {
   public void ladrar() {
      System.out.println("Puedo ladrar");
   }
}
class Main {
   public static void main(String[] args) {
      Dog dog1 = new Dog();
      perro1.comer();
      perro1.dormir();
      perro1.ladrar();
   }
}

Resultado de salida

Puedo comer
Puedo dormir
Puedo ladrar

Aquí, heredamos la subclase Dog del padre Animal. La clase Dog hereda los métodos eat() y sleep() de la clase Animal.

Por lo tanto, los objetos de la clase Dog pueden acceder a los miembros de la clase Dog y Animal.

clave protected

Hemos aprendido sobre los modificadores de acceso private y public en los tutoriales anteriores.

  • los miembros privados solo pueden accederse dentro de la clase

  • los miembros public pueden accederse desde cualquier lugar

También puede establecer métodos y campos como protected, los miembros protegidos pueden acceder

  • interno de la clase

  • en su subclase

  • dentro del mismo paquete

Esto es un resumen de los modificadores de acceso que se pueden visitar.

modificadorclase
paquete
subclaseglobal
public
privateNoNoNo
protectedNo

Ejemplo2:protected clave

class Animal {
   protected String type;
   private String color;
   public void comer() {
      System.out.println("Puedo comer");
   }
   public void dormir() {
      System.out.println("Puedo dormir");
   }
   public String getColor(){
      return color;
   }
   public void setColor(String col){
      color = col;
   }
}
class Dog extends Animal {
   public void displayInfo(String c){
      System.out.println("Soy un " + type);
      System.out.println("Mi color es " + c);
   }
   public void ladrar() {
      System.out.println("Puedo ladrar");
   }
}
class Main {
   public static void main(String[] args) {
      Dog dog1 = new Dog();
      perro1.comer();
      perro1.dormir();
      perro1.ladrar();
 
      perro1.type = "mammal";
      perro1.setColor("black");
      perro1.displayInfo(dog1.getColor()); 
   }
}

Resultado de salida

Puedo comer
Puedo dormir
Puedo ladrar
Soy un mamífero
Mi color es negro

Aquí, el campo de tipo de la clase Animal está protegido. Ya hemos accedido a este campo desde la clase Main

perro1.type = "mammal";

Esto es factible porque las clases Animal y Main están en el mismo paquete (mismo archivo).

Sobrecarga de métodos Java

Del ejemplo anterior, sabemos que el objeto de la subclase también puede acceder a los métodos de su superclase.

 ¿Qué pasa si se define el mismo método tanto en la superclase como en la subclase?

Bien, en este caso, el método de la subclase sobrescribe el método de la superclase. Por ejemplo,

Ejemplo3Sobrecarga de métodos/Ejemplo de sobrecarga

class Animal {
   protected String type = "animal";
   public void comer() {
      System.out.println("Puedo comer");
   }
   public void dormir() {
      System.out.println("Puedo dormir");
   }
}
class Dog extends Animal {
  
   @Override
   public void comer() {
      System.out.println("Yo como comida para perros");
   }
   public void ladrar() {
      System.out.println("Puedo ladrar");
   }
}
class Main {
   public static void main(String[] args) {
      Dog dog1 = new Dog();
      perro1.comer();
      perro1.dormir();
      perro1.ladrar();
   }
}

Resultado de salida

Yo como comida para perros
Puedo dormir
Puedo ladrar

Aquí, comer() aparece tanto en la superclase Animal como en la subclase Dog. Creamos un objeto de subclase Dog llamado dog1。

Cuando usamos dog1Al llamar al método eat() del objeto, se llama al método interno de Dog, no al método idéntico de la superclase. Esto se llama sobrecarga de métodos.

En el programa anterior, utilizamos la anotación @Override para informar al compilador de que estamos sobrescribiendo un método. Pero esto no es obligatorio. En el siguiente tutorial, vamos a aprender más sobreSobrecarga de métodos

Si necesita llamar al método eat() desde una subclase de Animal, utilice la clave super.

Ejemplo4super clave

class Animal {
   public Animal() {
     System.out.println("Soy un animal");
   }
   public void comer() {
     System.out.println("Puedo comer");
   }
}
class Dog extends Animal {
   public Dog(){
      super();
      System.out.println("Soy un perro");
   }
  @Override
  public void comer() {
     super.comer();
     System.out.println("Yo como comida para perros");
  }
   public void ladrar() {
      System.out.println("Puedo ladrar");
   }
}
class Main {
   public static void main(String[] args) {
      Dog dog1 = new Dog();
      perro1.comer();
      perro1.ladrar();
   }
}

Resultado de salida

Soy un animal
Soy un perro
Puedo comer
Yo como comida para perros
Puedo ladrar

在这里,我们使用了super关键字通过super()来调用构造函数。 另外,我们使用super.eat()调用Animal超类的eat()方法。

注意:调用构造函数和super方法时使用的区别。要了解更多信息,请访问Java super关键字

继承类型

继承有五种类型。

  • 单一继承 - B类A仅从类继承。

  • 多级继承 - B类从A类继承,然后C类从B类继承。

  • 分层继承 - A类作为B,C和D父类。

  • 多重继承 -类C从接口A和扩展B。

  • 混合继承 -两种或多种继承的混合。

Java不支持通过类的多重继承和混合继承。但是,我们可以通过接口在Java中实现多重继承。我们将在后面的章节中了解接口。

为什么要使用继承?

  • 最重要的用途是代码的可重用性。父类中存在的代码无需在子类中再次编写。

  • 通过方法重写实现运行时多态。在后面的章节中,我们将学习有关多态的更多信息。