Variabili di istanza e statiche
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 15 di 87.
Finora, ogni campo che abbiamo creato appartiene a un oggetto specifico. Ogni BankAccount ha il proprio balance e ogni Product ha il proprio name. Queste sono variabili di istanza: esistono separatamente per ogni istanza di una classe.
Ma cosa succede se ti servono dati condivisi da tutti gli oggetti? È qui che entrano in gioco le variabili statiche (chiamate anche variabili di classe). Una variabile statica appartiene alla classe stessa, non a un oggetto specifico.
public class Student {
private String name; // Variabile di istanza - univoca per ogni studente
private static int totalCount; // Variabile statica - condivisa da tutti gli studenti
public Student(String name) {
this.name = name;
totalCount++; // Incrementa il contatore condiviso
}
public static int getTotalCount() {
return totalCount;
}
}Quando crei più studenti, ognuno ha il proprio name, ma condividono tutti lo stesso totalCount:
Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount()); // Output: 2Nota che accediamo alla variabile statica tramite il nome della classe (Student.getTotalCount()) anziché tramite un oggetto. Questo sottolinea che i membri statici appartengono alla classe, non alle istanze.
Usa le variabili di istanza per i dati che variano tra gli oggetti (come il nome di uno studente). Usa le variabili statiche per i dati che dovrebbero essere condivisi (come contare quanti oggetti esistono).
Sfida
FacileCreiamo un sistema di inventario di Book che tenga traccia sia dei dettagli di ogni singolo libro, sia del numero totale di libri della tua collezione, usando variabili di istanza e statiche.
Creerai due file per organizzare il codice:
Book.java: crea una classe Book che tenga traccia delle informazioni di ogni singolo libro e del numero totale di libri creati:- Una variabile di istanza
title(String) - univoca per ogni libro - Una variabile di istanza
price(double) - univoca per ogni libro - Una variabile statica
totalBooks(int) - condivisa tra tutti gli oggetti Book, che tiene traccia del numero di libri creati - Un costruttore che accetta il titolo e il prezzo e incrementa il conteggio totale dei libri
- Un getter
getTitle()per il titolo - Un getter
getPrice()per il prezzo - Un metodo statico
getTotalBooks()che restituisce il numero totale di libri creati
- Una variabile di istanza
Main.java: crea più oggetti Book e mostra come il contatore statico tiene traccia di tutte le istanze. Riceverai in input tre titoli di libri e tre prezzi. Dopo aver creato tutti e tre i libri, stampa quattro righe:- Il titolo e il prezzo di ogni libro nel formato:
[title]: $[price](prezzo formattato con 2 cifre decimali) - Il numero totale di libri usando il metodo statico:
Total books: [count]
- Il titolo e il prezzo di ogni libro nel formato:
Riceverai sei input in quest'ordine: title1, price1, title2, price2, title3, price3.
Ricorda di accedere al metodo statico tramite il nome della classe (Book.getTotalBooks()) anziché tramite un'istanza di un oggetto. Per formattare i prezzi, usa String.format("%.2f", price).
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi gli input per tre libri
String title1 = scanner.nextLine();
double price1 = Double.parseDouble(scanner.nextLine());
String title2 = scanner.nextLine();
double price2 = Double.parseDouble(scanner.nextLine());
String title3 = scanner.nextLine();
double price3 = Double.parseDouble(scanner.nextLine());
// TODO: Crea tre oggetti Book usando gli input qui sopra
// TODO: Stampa il titolo e il prezzo di ogni libro nel formato: [title]: $[price]
// Usa String.format("%.2f", price) per formattare il prezzo con 2 cifre decimali
// TODO: Stampa il numero totale di libri usando il metodo statico
// Formato: Total books: [count]
// Ricorda di accedere al metodo statico tramite il nome della classe: Book.getTotalBooks()
}
}
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