Menu
Coddy logo textTech

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: 2

Nota 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).

challenge icon

Sfida

Facile

Creiamo 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
  • 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]

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()
    }
}
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