Verschiedene Möglichkeiten zum initialisieren von Variablen in Java
Stieß ich auf den code von guessgame
. Es ist ein code-snippet, wo drei Spieler-Objekte werden initialisiert, wenn Sie den folgenden Weg:
public class guessgame{
Player p1;
Player p2;
Player p3;
public void startGame() {
p1 = new Player();
p2 = new Player();
p3 = new Player();
...
}
...
}
Das gleiche funktioniert, wenn ich deklariert und initiiert es den folgenden Weg als gut.
public class GuessGame {
Player p1 = new Player();
Player p2 = new Player();
Player p3 = new Player();
public void startGame(){
...
}
...
}
Gibt es einen Unterschied zwischen den beiden? Im ersten Beispiel, warum wurde der drei Instanzvariablen deklariert, die außerhalb der startgame () - Methode, und ist es wirklich wichtig, intern?
- Die zweite version beginnt die drei Spieler auf die Instanziierung der
GuessGame
Klasse, die zuerst initialisiert Sie, wennstartGame()
ausgeführt wird. - Sie deklariert in der Klasse, in beiden Fällen.
- sorry, ich denke, ich kann nicht Lesen. Entfernen.
- 1 : Initialisierung in der Methode startGame() während den 2. Platz in der Klasse Ebene
- Was hat Linux damit zu tun haben?
- meinst du zu sagen "warum wurden die 3 Instanz-Variablen initialisiert, die außerhalb des startgame () - Methode...?" Offensichtlich sind Sie deklariert, die außerhalb der Methode, aber ich wollte nur klären, wenn Sie Frage war über die beiden Initialisierung Ansätze.
- Es kann nützlich sein, zu verlassen Variablen unitialialized auf Klassen-Ebene oder initialisieren Sie Sie als ein leeres Objekt, oder etwas, dass zeigt an, Ihre unitialialized. Auf diese Weise können Sie feststellen, ob eine Methode ausgeführt wurde, noch nicht. Es hängt wirklich von der Gestaltung Ihrer code aber.
- Ich hatte Zweifel über das sowohl die Initialisierung Ansätze und der Umfang der Variablen. Ich habe das geklärt. Danke.
- Der Umfang ist der gleiche auf beiden (Klasse Niveau), aber die Initialisierung ist anders (wie bereits von einigen Antworten hier)
- Im zweiten Beispiel fehlt eine schließende Klammer auf die startGame-Methode. Es macht mich ein bisschen verrückt.
- OCD in kicks? Ich Tat es für Sie 🙂
- lokale varibales vs Instanz varibales
- Die Klasse sah aus wie eine Methode, die auf den ersten Blick. Optische Illusionen FTW
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja. Der code in der ersten snippet wird nur ausgeführt wird, im Kontext der
startGame
. Wenn Sie nicht aufrufenstartGame
, die Objekte bleiben würdenull
. Jedes mal, wenn Sie rufenstartGame
, die alten Objekte werden, wenn ja, werden verworfen und durch neue ersetzt.Dem zweiten snippet ausführen, einmal für jeden
GuessGame
- Objekt beim Aufruf Ihrer Konstruktoren. Würde der code geteilt werden alle Konstruktoren.Nur so deklarieren Sie eine Instanz-variable ist, es zu tun außerhalb eine Methode. Variablen, die innerhalb einer Methode sind einheimischen.
Ein weiterer Unterschied zwischen der ersten und der zweiten Möglichkeit ist, dass das aufrufen von Instanz-Methoden Zugriff auf die Spieler wird "legal" nur nach dem Aufruf
startGame
im ersten code-snippet.Wenn Sie die Initialisierung außerhalb der Methode, dann wird es ausgeführt, sobald die Klasse instanziiert wird, und Speicher für Sie reserviert. Wenn Sie nicht, es wird nur ein null - (oder default-Wert für "primitive") zugewiesen.
Wenn Sie nie rufen Sie startgame(), dann bist du das verzögern der Zuweisung von it-und vielleicht für den Benutzer niemals will um das Spiel zu starten. Das ist clever, wenn die Spieler nehmen eine Menge von Speicher zu bauen, und Sie nicht möchten, dass der Benutzer warten, dass das passiert (memory allocation), und führen Sie einfach die Methoden sofort (verwenden Sie Sie nicht).
Wenn aus irgendeinem Grund, haben Sie mehrere Methoden verwenden müssen, die p1 -, p2 -, p3-Variablen, dann Abstimmung, wer wird initialisiert, kann verwirrend sein, so dass du vielleicht nur Biss die Kugel und initialisieren Sie diese im Voraus. Wenn Sie wissen, gibt es 3 Spieler, warum sollte die Methoden mit ihm? Ansonsten müssen Sie etwas tun, wie:
startGame()
ist, dass man immer ein neues Spiel starten durch den AufrufstartGame()
und die Spieler werden re-initialisiert. Das ist wichtig, wennPlayer
hält veränderliche Daten wie eine Partitur.In der zweiten Methode, Sie einfach das tun, beide Dinge gleichzeitig zu deklarieren und zu initialisieren. Der Unterschied ist, dass Sie benötigen, um ausführen
startGame()
- Methode im ersten Beispiel, Sie zu initialisieren.Auf Ihr erstes Beispiel, die Objekte werden erst dann instanziiert, wenn Sie die Methode aufrufen
startGame()
. Vor dem Aufruf dieser Methodep1
,p2
undp3
sind gleichnull
.Auf Ihrem zweiten Beispiel, Sie deklarieren und instanziieren Sie diese direkt. Damit Sie instanziiert sind, die bei der Erschaffung der Klasse.
1 : Initialisierung in der Methode startGame()
2.: auf Klassen-Ebene
p1
,p2
,p3
keine lokalen Variablen, aber Klasse Felder.Sie stehen alle Klassenmethoden, nachdem die Instanz der Klasse gebaut wurde.
In den ersten Schnipsel, die Werte der drei Felder sind
null
bis die MethodestartGame()
aufgerufen.In der zweiten Ausschnitt, der die Felder initialisiert, während Instanz-Konstruktion.