Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 brand del 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
  • 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 extends per 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!
  • 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()

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()
    }
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Java online