Instanz- vs. statische Variablen
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 15 von 87.
Bisher gehört jedes Feld, das wir erstellt haben, zu einem bestimmten Objekt. Jedes BankAccount hat sein eigenes 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 (Student.getTotalCount()) zugreifen, anstatt über ein Objekt. Dies unterstreicht, dass statische Member zur Klasse gehören und nicht zu Instanzen.
Verwenden Sie Instanzvariablen für Daten, die sich zwischen Objekten unterscheiden (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
EinfachErstelle ein Book-Inventarsystem, das sowohl die Details einzelner Bücher als auch die Gesamtzahl der Bücher in deiner gesamten Sammlung mithilfe von Instanz- und statischen Variablen erfasst.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
Book.java: Erstelle eine Book-Klasse, die Informationen zu einzelnen Büchern erfasst und gleichzeitig die Anzahl aller jemals erstellten Bücher speichert:- Eine Instanzvariable
title(String) – für jedes Buch einzigartig - Eine Instanzvariable
price(double) – für jedes Buch einzigartig - Eine statische Variable
totalBooks(int) – wird von allen Book-Objekten gemeinsam genutzt und erfasst, wie viele Bücher erstellt wurden - Einen Konstruktor, der den Titel und den Preis entgegennimmt und die Gesamtzahl der Bücher erhöht
- Einen Getter
getTitle()für den Titel - Einen Getter
getPrice()für den Preis - Eine statische Methode
getTotalBooks(), die die Gesamtzahl der erstellten Bücher zurückgibt
- Eine Instanzvariable
Main.java: Erstelle mehrere Book-Objekte und zeige, wie der statische Zähler alle Instanzen erfasst. Du erhältst drei Buchtitel und drei Preise als Eingaben. Nachdem alle drei Bücher erstellt wurden, gib vier Zeilen aus:- Den Titel und den Preis jedes Buches im Format:
[title]: $[price](Preis mit 2 Dezimalstellen formatiert) - Die Gesamtzahl der Bücher mithilfe der statischen Methode:
Total books: [count]
- Den Titel und den Preis jedes Buches im Format:
Du erhältst sechs Eingaben in dieser Reihenfolge: title1, price1, title2, price2, title3, price3.
Denke daran, auf die statische Methode über den Klassennamen (Book.getTotalBooks()) und nicht über eine Objektinstanz zuzugreifen. Verwende zur Formatierung der Preise String.format("%.2f", price).
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 Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler