La parola chiave super
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 21 di 87.
La parola chiave super offre a una sottoclasse un modo per fare riferimento alla sua classe genitore. È essenziale quando devi accedere ai membri o ai costruttori della classe genitore dall'interno di una classe figlia.
L'uso più comune di super è chiamare il costruttore della classe padre. Questa deve essere la prima istruzione nel costruttore della sottoclasse:
public class Vehicle {
private String brand;
public Vehicle(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
}
public class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // Deve essere la prima riga
this.doors = doors;
}
}Puoi anche usare super per chiamare i metodi della classe genitore, il che è particolarmente utile quando la sottoclasse ha un metodo con lo stesso nome:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // Chiama la versione di Animal
System.out.println("Meow!");
}
}Considera super come l'opposto di this. Mentre this si riferisce all'oggetto corrente, super si riferisce alla parte di quell'oggetto appartenente alla classe genitore. Questa distinzione diventa fondamentale quando si creano gerarchie di classi in cui le classi figlie devono estendere il comportamento della classe genitore, anziché sostituirlo completamente.
Sfida
FacileCostruiamo un sistema di elettrodomestici che dimostri come le classi figlie possono usare super per chiamare i costruttori della classe genitore ed estendere il comportamento dei metodi della classe genitore.
Creerai tre file per organizzare il tuo codice:
Appliance.java: crea la classe genitore che rappresenta qualsiasi elettrodomestico. Dovrebbe avere:- Un campo privato per la
branddell'elettrodomestico (String) - Un campo privato per
wattage(int) - Un costruttore che accetta entrambi i valori e li inizializza
- Un metodo
getBrand()che restituisce la marca - Un metodo
getWattage()che restituisce la potenza - Un metodo
getInfo()che restituisce:[brand] - [wattage]W
- Un campo privato per la
WashingMachine.java: crea una sottoclasse che estende Appliance. Una lavatrice ha tutto ciò che ha un elettrodomestico, oltre a caratteristiche speciali proprie:- Un campo privato per
capacity(int), che rappresenta la capacità di carico in kg - Un costruttore che accetta brand, wattage e capacity: usa
super(brand, wattage)per inizializzare la parte della classe genitore, quindi imposta la capacità - Un metodo
getCapacity()che restituisce la capacità - Un metodo
getInfo()che chiama il metodogetInfo()della classe genitore usandosuper.getInfo()e lo estende per restituire:[parent info], Capacity: [capacity]kg
- Un campo privato per
Main.java: crea una WashingMachine e visualizza tutte le sue informazioni. Riceverai tre input: la marca (String), la potenza (int) e la capacità (int). Stampa il risultato della chiamata agetInfo()sulla tua lavatrice.
Riceverai tre input: il nome della marca, la potenza e la capacità.
Nota come super abbia qui due scopi: chiamare il costruttore della classe genitore per inizializzare i campi ereditati e chiamare il metodo della classe genitore per estenderne il comportamento anziché sostituirlo completamente.
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 brand = scanner.nextLine();
int wattage = scanner.nextInt();
int capacity = scanner.nextInt();
// TODO: Crea un oggetto WashingMachine con i valori di input
// TODO: Stampa il risultato della chiamata a getInfo() sulla lavatrice
}
}
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