Ereditarietà di base (extends)
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 20 di 87.
L’ereditarietà è uno dei pilastri fondamentali della programmazione orientata agli oggetti (OOP). Consente a una classe di acquisire le proprietà e i metodi di un’altra classe, favorendo il riutilizzo del codice e stabilendo una gerarchia naturale tra le classi.
In Java, crei una relazione di ereditarietà usando la parola chiave extends. La classe che eredita è chiamata sottoclasse (o classe figlia), mentre la classe da cui si eredita è chiamata superclasse (o classe genitore).
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // Chiama il costruttore della classe genitore
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}La classe Dog eredita automaticamente il metodo eat() e il metodo getName() da Animal. Può anche definire i propri metodi, come bark():
Dog myDog = new Dog("Buddy");
myDog.eat(); // Ereditato: "Buddy is eating"
myDog.bark(); // Metodo proprio: "Buddy says woof!"Considera l’ereditarietà come una relazione «è un». Un Dog è un Animal, quindi ha senso che Dog estenda Animal. Questa relazione ti permette di creare classi specializzate che condividono funzionalità comuni e aggiungono al contempo i propri comportamenti specifici.
Sfida
FacileCostruiamo un semplice sistema di veicoli che dimostri l'ereditarietà in azione. Creerai una classe genitore che contiene le proprietà comuni dei veicoli e una classe figlia che la estende con un comportamento specializzato.
Organizzerai il codice in tre file:
Vehicle.java: crea la classe genitore che rappresenta qualsiasi veicolo. Dovrebbe avere:- Un campo privato per il
branddel veicolo (String) - Un costruttore che accetta il nome del brand e lo assegna al campo. (Qui non è necessaria alcuna chiamata a
super(), poiché Vehicle è al vertice della gerarchia.) - Un metodo
getBrand()che restituisce il brand - Un metodo
start()che stampa:[brand] is starting
- Un campo privato per il
Motorcycle.java: crea una sottoclasse che estende Vehicle. Una motocicletta è un veicolo, quindi questa relazione "is-a" rende appropriata l'ereditarietà. La tua classe Motorcycle dovrebbe:- Usare
extendsper ereditare da Vehicle - Avere un costruttore che accetta il brand e lo passa alla classe genitore usando
super(brand) - Aggiungere un proprio metodo
wheelie()che stampa:[brand] is doing a wheelie!
- Usare
Main.java: metti tutto insieme creando un oggetto Motorcycle e dimostrando sia i comportamenti ereditati sia quelli specifici. Riceverai un input: il nome del brand. Stampa due righe chiamando:- Il metodo ereditato
start() - Il metodo specifico di Motorcycle
wheelie()
- Il metodo ereditato
Riceverai un input: il nome del brand (String) della tua motocicletta.
Nota come la tua classe Motorcycle abbia automaticamente accesso a start() e getBrand() senza doverli riscrivere: questa è la potenza dell'ereditarietà!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: Crea un oggetto Motorcycle con la marca
// TODO: Chiama il metodo ereditato start()
// TODO: Chiama il metodo wheelie()
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online