Sobes.tech
Middle

Ce sunt moștenirea și polimorfismul în tipurile de date referință?

sobes.tech AI

Răspuns de la AI

Moștenirea este un mecanism care permite unui nou clas (clasă derivată, subclasă) să moștenească câmpuri și metode ale unei clase existente (clasă părinte, superclasă). Acest lucru promovează reutilizarea codului și ierarhia claselor.

Polimorfismul (diversitatea formelor) este capacitatea unui obiect de a avea mai multe forme. În contextul tipurilor de date referențiale, acest lucru înseamnă că o variabilă de superclasă poate face referire la un obiect de subclasă. Acest lucru permite tratarea obiectelor diferitelor subclase într-un mod unificat prin intermediul unei interfețe comune sau superclase.

Există două tipuri principale de polimorfism:

  1. Timpul de compilare (polimorfism static): de obicei realizat prin suprasarcina metodelor (method overloading), când într-o clasă există mai multe metode cu același nume, dar cu semnături diferite (număr și/sau tipuri de parametri).
  2. Timpul de execuție (polimorfism dinamic): realizat prin suprascrierea metodelor (method overriding), când o subclasă oferă propria sa implementare a unei metode deja definite în superclasă. La apelarea acestei metode printr-o referință la superclasă, va fi executată implementarea subclasei (dacă tipul obiectului este o subclasă).

Exemplu de moștenire și polimorfism dinamic:

// Clasa de bază
class Animal {
    public void makeSound() {
        System.out.println("Sunet generic de animal");
    }
}

// Clasa derivată
class Dog extends Animal {
    @Override // Suprascrierea metodei
    public void makeSound() {
        System.out.println("Ham!");
    }
}

// Clasa derivată
class Cat extends Animal {
    @Override // Suprascrierea metodei
    public void makeSound() {
        System.out.println("Miau!");
    }
}

public class Main {
    public static void main(String[] args) {
        // Tip static al variabilei Animal, tip dinamic al obiectului Dog
        Animal myDog = new Dog();
        // Tip static al variabilei Animal, tip dinamic al obiectului Cat
        Animal myCat = new Cat();
        // Tip static al variabilei Animal, tip dinamic al obiectului Animal
        Animal genericAnimal = new Animal();

        // Demonstrație de polimorfism
        myDog.makeSound(); // Va apela metoda din Dog
        myCat.makeSound(); // Va apela metoda din Cat
        genericAnimal.makeSound(); // Va apela metoda din Animal
    }
}

În acest exemplu, Dog și Cat moștenesc de la Animal. Variabilele myDog, myCat și genericAnimal au tip static Animal, dar fac referire la obiecte de tipuri dinamice diferite (Dog, Cat, Animal). La apelarea metodei makeSound(), în fiecare referință se execută implementarea corespunzătoare a metodei în funcție de tipul dinamic al obiectului, ceea ce reprezintă polimorfismul în timpul execuției.