Sobes.tech
Middle

¿Qué son la herencia y el polimorfismo en los tipos de datos referenciales?

sobes.tech AI

Respuesta de la IA

La herencia es un mecanismo que permite a una nueva clase (clase hija, subclase) heredar campos y métodos de una clase existente (clase padre, superclase). Esto promueve la reutilización del código y la jerarquía de clases.

El polimorfismo (variedad de formas) es la capacidad de un objeto para tener varias formas. En el contexto de tipos de datos referenciales, esto significa que una variable de superclase puede referirse a un objeto de una subclase. Esto permite tratar objetos de diferentes subclases de manera unificada a través de una interfaz común o superclase.

Existen dos tipos principales de polimorfismo:

  1. Tiempo de compilación (polimorfismo estático): Generalmente se logra mediante la sobrecarga de métodos (method overloading), cuando en una clase hay varios métodos con el mismo nombre pero diferentes firmas (cantidad y/o tipos de parámetros).
  2. Tiempo de ejecución (polimorfismo dinámico): Se logra mediante la sobrescritura de métodos (method overriding), cuando una subclase proporciona su propia implementación de un método ya definido en la superclase. Al llamar a dicho método a través de una referencia a la superclase, se ejecutará la implementación de la subclase (si el tipo del objeto es una subclase).

Ejemplo de herencia y polimorfismo dinámico:

// Clase base
class Animal {
    public void makeSound() {
        System.out.println("Sonido genérico de animal");
    }
}

// Clase heredada
class Dog extends Animal {
    @Override // Sobrescritura de método
    public void makeSound() {
        System.out.println("¡Guau!");
    }
}

// Clase heredada
class Cat extends Animal {
    @Override // Sobrescritura de método
    public void makeSound() {
        System.out.println("¡Miau!");
    }
}

public class Main {
    public static void main(String[] args) {
        // Tipo estático de la variable Animal, tipo dinámico del objeto Dog
        Animal myDog = new Dog();
        // Tipo estático de la variable Animal, tipo dinámico del objeto Cat
        Animal myCat = new Cat();
        // Tipo estático de la variable Animal, tipo dinámico del objeto Animal
        Animal genericAnimal = new Animal();

        // Demostración de polimorfismo
        myDog.makeSound(); // Llamará al método de Dog
        myCat.makeSound(); // Llamará al método de Cat
        genericAnimal.makeSound(); // Llamará al método de Animal
    }
}

En este ejemplo, Dog y Cat heredan de Animal. Las variables myDog, myCat y genericAnimal tienen tipo estático Animal, pero hacen referencia a objetos de diferentes tipos dinámicos (Dog, Cat, Animal). Al llamar al método makeSound(), en cada referencia se ejecuta la implementación correspondiente del método según el tipo dinámico del objeto, lo cual es polimorfismo en tiempo de ejecución.