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.
Sfida
FacileCostruiamo 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) eprice(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()egetPrice()per accedere ai campi
- Campi privati per
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)
- Un campo privato per
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 digetDetails().
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()
}
}
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