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: 2Beachten 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).
Aufgabe
EinfachLassen 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
- Eine Instanzvariable
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]
- Den Titel und den Preis jedes Buches im Format:
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: 2Verwenden 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()
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem