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:
- 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).
- 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.