Ich bin neu in der objektorientierten Programmierung und habe das folgende Problem.
(Beachten Sie, dass diese Lösung ein Teil ist meines Problems)
Ich brauche eine Variable, auf die sich viele Objekte beziehen können, aber für jedes Objekt einige "private" Informationen aufbewahren. Um genauer zu sein, habe ich eine Klasse namens Worker
erstellt und möchte, dass jedes Objekt dieser Klasse eine eindeutige ID vom Typ int
hat. Also, erstes Objekt hat ID=1
, zweites ID=2
etc ... Beachten Sie, dass ich nicht nur eine zufällige Ganzzahl will, während ich anfangen muss, von 0 zu zählen und zu erhöhen ...
Deklaration und Initialisierung der Variablen in der Klasse
%Vor%und ich habe versucht, die Incrementation zu implementieren, indem ich diese Codezeile in den Konstruktor-Body
hinzufüge %Vor% Ich instanziiere einige Objekte, füge sie zu ArrayList
hinzu und benutze eine for-Schleife, um die Variablen jedes Objekts zu drucken.
und getWorkerId()
(Klassenmethode) besteht aus
Problem ist, dass mein Programm nicht jedes eindeutige workID
(weil es nicht gibt), sondern den letzten Wert der statischen Variable (was zufällig die Anzahl der Objekte ist) druckt.
Können Sie eine Lösung für mein Problem beschreiben?
Kommentar hat geantwortet:
Sie sind auf dem richtigen Weg.
Derzeit wird Ihr statisches Mitglied mit jedem von Ihnen erstellten Mitarbeiter erhöht. Dies bedeutet, dass es keine ID eines Arbeiters enthält (dies kann nicht der Fall sein, da eine statische Variable zu der Klasse anstelle einzelner Instanzen gehört), stattdessen enthält sie die Gesamtzahl der bisher von Ihnen erstellten Worker .
Korrektur
numWorkers
um, damit es wiedergibt, was es tut id
(oder workerId
, wenn Sie bevorzugen) workId++
in id = ++numWorkers
Warum?
Nun hat jeder Arbeiter sein eigenes id
. Sie ordnen es zu, indem Sie die aktuelle Anzahl der erstellten Worker ( numWorkers
) betrachten, diesen Wert um eins erhöhen und dann id
zuweisen. Auf diese Weise wird die ID Ihres ersten Mitarbeiters 1
, die zweite lautet 2
und so weiter. numWorkers
enthält immer die Anzahl der erstellten Arbeiter, die gleichzeitig die letzte ID ist, die Sie ausgegeben haben.
Zusammenfügen
Da diese Frage einige Upvotes (= Interesse) bekommen hat, fasse ich das Obige in einem Blueprint zusammen:
%Vor% Beachten Sie, dass Sie in Java den primitiven Typ nicht initialisieren müssen int
bis 0
, da dies der Standardwert für int
ist . Natürlich ist es in Ordnung, es trotzdem zu tun - es tut nie weh, explizit zu sein.
Sie sind tatsächlich ziemlich nah am Erfolg.
Statische Member gehören, wie Sie vielleicht schon wissen, zu der Klasse selbst, nicht zu jeder Instanz. Aber wie Sie sagten, sollte jeder Arbeiter seine eigene eindeutige ID haben, also sollte workId
nicht statisch sein.
Wir benötigen jedoch immer noch eine statische Variable, um zu verfolgen, welche ID dem nächsten von uns erstellten Mitarbeiter übergeben werden soll. Lassen Sie uns eins erklären:
%Vor% Dann ordnen Sie in Ihrem Konstruktor nextWorkId
zu workId
zu, dann erhöhen Sie nextWorkId
:
Sie können es auch so schreiben:
%Vor%