Cosa sono l'ereditarietà e il polimorfismo nei tipi di dati di riferimento?
sobes.tech AI
Risposta dell'AI
L'ereditarietà è un meccanismo che consente a una nuova classe (sottoclasse, classe figlia) di ereditare campi e metodi di una classe esistente (superclasse, classe genitore). Questo promuove il riutilizzo del codice e la gerarchia delle classi.
Il polimorfismo (diversità di forme) è la capacità di un oggetto di avere più forme. Nel contesto dei tipi di dati di riferimento, ciò significa che una variabile di superclasse può riferirsi a un oggetto di una sottoclasse. Questo permette di trattare oggetti di diverse sottoclassi in modo unificato attraverso un'interfaccia comune o una superclasse.
Esistono due principali tipi di polimorfismo:
- Tempo di compilazione (polimorfismo statico): di solito raggiunto tramite l'overloading dei metodi (method overloading), quando in una classe ci sono più metodi con lo stesso nome ma firme diverse (numero e/o tipi di parametri).
- Tempo di esecuzione (polimorfismo dinamico): raggiunto tramite l'override dei metodi (method overriding), quando una sottoclasse fornisce la propria implementazione di un metodo già definito nella superclasse. Quando si chiama questo metodo tramite un riferimento alla superclasse, verrà eseguita l'implementazione della sottoclasse (se il tipo dell'oggetto è una sottoclasse).
Esempio di ereditarietà e polimorfismo dinamico:
// Classe base
class Animal {
public void makeSound() {
System.out.println("Suono generico di animale");
}
}
// Classe derivata
class Dog extends Animal {
@Override // Override del metodo
public void makeSound() {
System.out.println("Bau!");
}
}
// Classe derivata
class Cat extends Animal {
@Override // Override del metodo
public void makeSound() {
System.out.println("Miao!");
}
}
public class Main {
public static void main(String[] args) {
// Tipo statico della variabile Animal, tipo dinamico dell'oggetto Dog
Animal myDog = new Dog();
// Tipo statico della variabile Animal, tipo dinamico dell'oggetto Cat
Animal myCat = new Cat();
// Tipo statico della variabile Animal, tipo dinamico dell'oggetto Animal
Animal genericAnimal = new Animal();
// Dimostrazione di polimorfismo
myDog.makeSound(); // Chiamerà il metodo di Dog
myCat.makeSound(); // Chiamerà il metodo di Cat
genericAnimal.makeSound(); // Chiamerà il metodo di Animal
}
}
In questo esempio, Dog e Cat ereditano da Animal. Le variabili myDog, myCat e genericAnimal hanno tipo statico Animal, ma fanno riferimento a oggetti di diversi tipi dinamici (Dog, Cat, Animal). Quando si chiama il metodo makeSound(), in ogni riferimento viene eseguita l'implementazione corrispondente del metodo in base al tipo dinamico dell'oggetto, il che rappresenta il polimorfismo in tempo di esecuzione.