Menu
Coddy logo textTech

Instanz- vs. statische Variablen

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 15 von 87.

Bisher gehörte jedes Feld, das wir erstellt haben, zu einem bestimmten Objekt. Jedes BankAccount hat seinen eigenen balance, und jedes Product hat seinen eigenen name. Dies sind Instanzvariablen – sie existieren separat für jede Instanz einer Klasse.

Aber was ist, wenn Sie Daten benötigen, die über alle Objekte hinweg geteilt werden? Hier kommen statische Variablen (auch Klassenvariablen genannt) ins Spiel. Eine statische Variable gehört zur Klasse selbst, nicht zu einem bestimmten Objekt.

public class Student {
    private String name;           // Instanzvariable - eindeutig pro Student
    private static int totalCount; // Statische Variable - wird von allen Studenten geteilt
    
    public Student(String name) {
        this.name = name;
        totalCount++;  // Erhöht den gemeinsamen Zähler
    }
    
    public static int getTotalCount() {
        return totalCount;
    }
}

Wenn Sie mehrere Studenten erstellen, hat jeder seinen eigenen name, aber alle teilen sich denselben totalCount:

Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount());  // Ausgabe: 2

Beachten Sie, wie wir auf die statische Variable über den Klassennamen zugreifen (Student.getTotalCount()), anstatt über ein Objekt. Dies unterstreicht, dass statische Member zur Klasse gehören und nicht zu Instanzen.

Verwenden Sie Instanzvariablen für Daten, die zwischen Objekten variieren (wie der Name eines Schülers). Verwenden Sie statische Variablen für Daten, die gemeinsam genutzt werden sollen (wie das Zählen, wie viele Objekte existieren).

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Book-Inventarsystem erstellen, das sowohl Details zu einzelnen Büchern als auch die Gesamtzahl der Bücher in Ihrer gesamten Sammlung mithilfe von Instanz- und statischen Variablen verfolgt.

Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:

  • Book.java: Erstellen Sie eine Book-Klasse, die Informationen zu einzelnen Büchern verfolgt und gleichzeitig die Anzahl aller jemals erstellten Bücher zählt:
    • Eine Instanzvariable title (String) – eindeutig für jedes Buch
    • Eine Instanzvariable price (double) – eindeutig für jedes Buch
    • Eine statische Variable totalBooks (int) – wird von allen Book-Objekten gemeinsam genutzt und verfolgt, wie viele Bücher erstellt wurden
    • Ein Konstruktor, der den Titel und den Preis entgegennimmt und den Gesamtzähler der Bücher erhöht
    • Ein Getter getTitle() für den Titel
    • Ein Getter getPrice() für den Preis
    • Eine statische Methode getTotalBooks(), die die Gesamtzahl der erstellten Bücher zurückgibt
  • Main.java: Erstellen Sie mehrere Book-Objekte und demonstrieren Sie, wie der statische Zähler alle Instanzen verfolgt. Sie erhalten drei Buchtitel und drei Preise als Eingaben. Nachdem Sie alle drei Bücher erstellt haben, geben Sie vier Zeilen aus:
    • Den Titel und den Preis jedes Buches im Format: [title]: $[price] (Preis auf 2 Dezimalstellen formatiert)
    • Die Gesamtzahl der Bücher unter Verwendung der statischen Methode: Total books: [count]

Sie erhalten sechs Eingaben in der Reihenfolge: title1, price1, title2, price2, title3, price3.

Denken Sie daran, auf die statische Methode über den Klassennamen (Book.getTotalBooks()) zuzugreifen und nicht über eine Objektinstanz. Verwenden Sie zur Formatierung von Preisen String.format("%.2f", price).

Spickzettel

Eine statische Variable (auch Klassenvariable genannt) gehört zur Klasse selbst und wird von allen Instanzen dieser Klasse gemeinsam genutzt, im Gegensatz zu Instanzvariablen, die für jedes Objekt eindeutig sind.

Deklarieren Sie eine statische Variable mit dem Schlüsselwort static:

public class Student {
    private String name;           // Instance variable - unique per student
    private static int totalCount; // Static variable - shared by all students
    
    public Student(String name) {
        this.name = name;
        totalCount++;  // Increments the shared counter
    }
    
    public static int getTotalCount() {
        return totalCount;
    }
}

Greifen Sie auf statische Variablen und Methoden über den Klassennamen zu, anstatt über eine Objektinstanz:

Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount());  // Output: 2

Verwenden Sie Instanzvariablen für Daten, die zwischen Objekten variieren. Verwenden Sie statische Variablen für Daten, die über alle Instanzen hinweg gemeinsam genutzt werden sollen.

Probier es selbst

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Eingaben für drei Bücher lesen
        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: Erstelle drei Book-Objekte unter Verwendung der obigen Eingaben
        
        // TODO: Gib Titel und Preis jedes Buches im Format [title]: $[price] aus
        // Verwende String.format("%.2f", price), um den Preis auf 2 Dezimalstellen zu formatieren
        
        // TODO: Gib die Gesamtzahl der Bücher mithilfe der statischen Methode aus
        // Format: Total books: [count]
        // Denke daran, auf die statische Methode über den Klassennamen zuzugreifen: Book.getTotalBooks()
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung