Menu
Coddy logo textTech

Instanz- vs. statische Member

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 17 von 110.

In Dart-Klassen können Member (Variablen und Methoden) entweder zu einzelnen Objekten oder zur Klasse selbst gehören. Das Verständnis dieser Unterscheidung ist grundlegend für die effektive Organisation Ihres Codes.

Instanzmitglieder gehören zu jedem Objekt, das Sie erstellen. Jedes Objekt erhält seine eigene Kopie der Instanzvariablen, und Instanzmethoden operieren auf den Daten dieses spezifischen Objekts:

class Dog {
  String name;  // Instanzvariable
  
  Dog(this.name);
  
  void bark() {  // Instanzmethode
    print('$name says woof!');
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

dog1.bark();  // Buddy sagt wuff!
dog2.bark();  // Max sagt wuff!

Jedes Dog-Objekt hat seinen eigenen name. Das Ändern des Namens eines Hundes hat keinen Einfluss auf den anderen.

Statische Member gehören zur Klasse selbst, nicht zu einem bestimmten Objekt. Sie werden von allen Instanzen gemeinsam genutzt und über den Klassennamen aufgerufen:

class Dog {
  String name;
  static int totalDogs = 0;  // Statische Variable
  
  Dog(this.name) {
    totalDogs++;
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

print(Dog.totalDogs);  // 2

Die Variable totalDogs wird gemeinsam genutzt – es gibt nur eine Kopie, unabhängig davon, wie viele Dog-Objekte existieren. Sie greifen über den Klassennamen Dog.totalDogs darauf zu, nicht über eine Instanz.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Besucherzählsystem für ein Museum bauen, das sowohl die Besuche einzelner Exponate als auch die Gesamtstatistik des Museums erfasst.

Sie werden Ihren Code in zwei Dateien organisieren:

  • exhibit.dart: Definieren Sie eine Klasse Exhibit, die ein Museumsexponat darstellt. Jedes Exponat sollte Folgendes haben:
    • Eine Instanzvariable name (String) für den Namen des Exponats
    • Eine Instanzvariable visitorCount (int), die bei 0 beginnt, um zu verfolgen, wie viele Personen dieses spezifische Exponat besucht haben
    • Eine statische Variable totalVisitors (int), die bei 0 beginnt, um die Gesamtbesuche über alle Exponate hinweg zu verfolgen
    • Einen Konstruktor, der den Namen des Exponats entgegennimmt
    • Eine Methode recordVisit(), die sowohl den visitorCount des Exponats als auch die totalVisitors der Klasse erhöht
    • Eine Methode displayStats(), die die Informationen des Exponats ausgibt
  • main.dart: Importieren Sie Ihre Exponat-Klasse und erstellen Sie zwei Exponate:
    • Ein 'Dinosaur Bones' Exponat
    • Ein 'Ancient Egypt' Exponat
    Registrieren Sie 3 Besuche für das Dinosaur Bones Exponat und registrieren Sie dann 2 Besuche für das Ancient Egypt Exponat. Rufen Sie nach allen Besuchen displayStats() für jedes Exponat in der Reihenfolge ihrer Erstellung auf und geben Sie dann die Gesamtzahl der Besucher über alle Exponate hinweg aus.

Die Methode displayStats() sollte in genau diesem Format drucken:

[name]: [visitorCount] visitors

Für die Zeile der Gesamtbesucher geben Sie Folgendes aus:

Total museum visitors: [totalVisitors]

Greifen Sie auf die statische Variable über den Klassennamen Exhibit.totalVisitors zu.

Erwartete Ausgabe:

Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5

Spickzettel

Klassenmitglieder in Dart können entweder Instanzmitglieder (die zu einzelnen Objekten gehören) oder statische Mitglieder (die zur Klasse selbst gehören) sein.

Instanzmitglieder sind für jedes Objekt eindeutig. Jedes Objekt hat seine eigene Kopie der Instanzvariablen:

class Dog {
  String name;  // Instanzvariable
  
  Dog(this.name);
  
  void bark() {  // Instanzmethode
    print('$name says woof!');
  }
}

Statische Mitglieder werden von allen Instanzen gemeinsam genutzt und über den Klassennamen mit dem Schlüsselwort static aufgerufen:

class Dog {
  String name;
  static int totalDogs = 0;  // Statische Variable
  
  Dog(this.name) {
    totalDogs++;
  }
}

// Zugriff auf statische Mitglieder über den Klassennamen
print(Dog.totalDogs);  // 2

Statische Variablen behalten einen einzigen gemeinsamen Wert bei, unabhängig davon, wie viele Objekte erstellt werden.

Probier es selbst

import 'exhibit.dart';

void main() {
  // TODO: Erstelle eine 'Dinosaur Bones' Ausstellung
  
  // TODO: Erstelle eine 'Ancient Egypt' Ausstellung
  
  // TODO: Erfasse 3 Besuche für die Dinosaur Bones Ausstellung
  
  // TODO: Erfasse 2 Besuche für die Ancient Egypt Ausstellung
  
  // TODO: Rufe displayStats() für jede Ausstellung in der richtigen Reihenfolge auf
  
  // TODO: Gib die Gesamtzahl der Museumsgäste unter Verwendung von Exhibit.totalVisitors aus
  // Format: Total museum visitors: [totalVisitors]
}
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