Menu
Coddy logo textTech

Concatenamento dei costruttori

Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 23 di 87.

Il concatenamento dei costruttori è il processo di chiamare un costruttore da un altro. Questa tecnica aiuta a evitare la duplicazione del codice quando una classe ha più costruttori o quando si lavora con gerarchie di ereditarietà.

All'interno della stessa classe, puoi concatenare i costruttori usando this(). Questo ti permette di avere un costruttore «principale» che fa tutto il lavoro, mentre gli altri costruttori si limitano a delegare a esso:

public class Rectangle {
    private int width;
    private int height;
    
    public Rectangle() {
        this(1, 1);  // Chiama il costruttore con due parametri
    }
    
    public Rectangle(int size) {
        this(size, size);  // Crea un quadrato
    }
    
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

Nell'ereditarietà, il concatenamento dei costruttori avviene automaticamente. Quando crei un oggetto di una sottoclasse, Java chiama prima il costruttore della classe genitore usando super(). Se non chiami esplicitamente super(), Java inserisce automaticamente super() (la versione senza argomenti):

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
        System.out.println("Animal constructor");
    }
}

public class Dog extends Animal {
    private String breed;
    
    public Dog(String name, String breed) {
        super(name);  // Deve essere la prima riga
        this.breed = breed;
        System.out.println("Dog constructor");
    }
}

La creazione di new Dog("Buddy", "Labrador") stampa prima "Animal constructor", poi "Dog constructor". Questo garantisce che le classi genitore vengano sempre inizializzate correttamente prima che la classe figlia aggiunga la propria configurazione.

challenge icon

Sfida

Facile

Costruiamo un sistema di ordinazione di prodotti che dimostri il concatenamento dei costruttori sia all'interno di una classe sia lungo una gerarchia di ereditarietà. Vedrai come this() concatena i costruttori nella stessa classe, mentre super() richiama i costruttori della classe genitore.

Creerai tre file per organizzare il codice:

  • Product.java: crea una classe genitore che rappresenti qualsiasi prodotto in un negozio. Dovrebbe avere:
    • Campi privati per name (String) e price (double)
    • Un costruttore principale che accetti sia il nome sia il prezzo, inizializzi i campi e stampi: Product constructor: [name]
    • Un secondo costruttore che accetti solo il nome e richiami il costruttore principale usando this(name, 0.0) per impostare un prezzo predefinito di 0.0
    • I metodi getName() e getPrice() per accedere ai campi
  • Electronics.java: crea una sottoclasse che estenda Product e aggiunga le informazioni sulla garanzia:
    • Un campo privato per warrantyYears (int)
    • Un costruttore principale che accetti nome, prezzo e warrantyYears: usa super(name, price) per inizializzare la classe genitore, quindi imposta la garanzia e stampa: Electronics constructor: [warrantyYears] year warranty
    • Un secondo costruttore che accetti solo nome e prezzo e richiami il costruttore principale con this(name, price, 1) per fornire una garanzia predefinita di 1 anno
    • Un terzo costruttore che accetti solo il nome e richiami il secondo costruttore con this(name, 0.0)
    • Un metodo getDetails() che restituisca: [name] - $[price] ([warrantyYears] year warranty)
  • Main.java: mostra il concatenamento dei costruttori in azione. Riceverai tre input: il nome di un prodotto (String), il prezzo (double) e gli anni di garanzia (int). Crea un oggetto Electronics usando tutti e tre i parametri, quindi stampa il risultato di getDetails().

Riceverai tre input: il nome del prodotto, il prezzo e gli anni di garanzia.

Formatta il prezzo in getDetails() in modo da mostrare 2 cifre decimali usando String.format("%.2f", price). Fai attenzione all'output: vedrai apparire i messaggi dei costruttori nell'ordine, mostrando come la catena procede dalla classe genitore a quella figlia!

Provalo tu

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Leggi i dati di input
        String name = scanner.nextLine();
        double price = scanner.nextDouble();
        int warrantyYears = scanner.nextInt();
        
        // TODO: Crea un oggetto Electronics usando tutti e tre i parametri
        
        // TODO: Stampa il risultato di getDetails()
    }
}
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