2015-10-23 16 views
10

Ich stieß auf den Code guessgame. Es gibt einen Code-Schnipsel in dem drei Spieler Objekte die folgende Art und Weise initialisiert werden:Verschiedene Möglichkeiten zum Initialisieren von Variablen in Java

public class guessgame{ 
    Player p1; 
    Player p2; 
    Player p3; 
    public void startGame() { 
     p1 = new Player(); 
     p2 = new Player(); 
     p3 = new Player(); 
    ... 
    } 
    ... 
} 

Das gleiche gearbeitet, als ich erklärt und leitete sie das auch folgende Art und Weise.

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? Warum wurden im ersten Beispiel die drei Instanzvariablen außerhalb der startgame() -Methode deklariert, und spielt das wirklich eine Rolle?

+2

Die zweite Version initialisiert die drei Spieler auf Instanziierung der 'GuessGame' Klasse, die erste initialisiert sie wenn 'startGame()' ausgeführt wird. – Phylogenesis

+1

@CaffeineToCode Sie werden in beiden Fällen auf Klassenebene deklariert. – Phylogenesis

+0

@Phylogenesis Sorry, ich denke, ich kann nicht lesen. Entfernen. – CaffeineToCode

Antwort

10

Gibt es einen Unterschied zwischen den beiden?

Ja. Der Code im ersten Snippet wird nur im Kontext von startGame ausgeführt. Wenn Sie nicht startGame aufrufen, bleiben die Objekte null. Jedes Mal, wenn Sie startGame aufrufen, werden die alten Objekte, falls vorhanden, verworfen und durch neue ersetzt.

Der zweite Snippet würde ausführen einmal für jedes GuessGame Objekt, wenn Sie eine ihrer Erbauer nennen. Der Code würde unter allen Konstruktoren geteilt werden.

Im ersten Beispiel, warum die drei Instanzvariablen außerhalb der Methode startGame() erklärt

Die einzige Möglichkeit, eine Instanz Variable zu deklarieren, ist es außerhalb ein Verfahren zu tun. Innerhalb einer Methode deklarierte Variablen sind Locals.

Ein weiterer Unterschied zwischen der ersten und zweiten Möglichkeit besteht darin, dass der Aufruf von Instanzmethoden, die auf Spieler zugreifen, erst nach dem Aufruf von startGame im ersten Code-Snippet "legal" wird.

3

Bei der zweiten Methode, die Sie tun einfach beides zugleich - deklarieren und initialisieren. Der Unterschied besteht darin, dass Sie im ersten Beispiel die Methode startGame() ausführen müssen, um sie zu initialisieren.

1

p1, p2, p3 sind keine lokalen Variablen, sondern Klassenfelder.

Sie sind für alle Klassenmethoden verfügbar, nachdem die Klasseninstanz erstellt wurde.

Im ersten Schnipsel, die Werte der drei Felder sind nullbisstartGame() Verfahren aufgerufen wird.

Im zweiten Schnipsel werden die Felder während der Exemplar Konstruktion initialisiert.

+0

Vielen Dank. Macht Sinn. – nohup

7

Wenn Sie außerhalb der Methode initialisieren, dann wird es ausgeführt, wenn die Klasse instanziiert und Speicher ist für sie zugeordnet. Ist dies nicht der Fall, wird nur eine Null (oder ein Standardwert für Primitive) zugewiesen.

Wenn Sie rufen startgame nie(), dann verzögern Sie die verteilenden und vielleicht die Nutzer wollen nie das Spiel starten.Dies ist schlau, wenn die Spieler viel Speicher zum Erstellen benötigen und der Benutzer nicht darauf warten soll (Speicherzuweisung) und einfach Methoden sofort ausführen (die sie nicht verwenden).

Wenn Sie aus irgendeinem Grund mehrere Methoden haben, die die Variablen p1, p2, p3 verwenden müssen, dann kann die Koordination der Initialisierung verwirrend sein, also könnten Sie die Kugel beißen und initialisieren. Wenn Sie wissen, dass es 3 Spieler geben wird, warum sollten Sie die Methoden damit umgehen? Sonst wirst du so etwas wie zu tun haben:

if (p1 == null){ 
    p1 = new Player(); 
} 
+0

Der Hauptvorteil der Initialisierung in 'startGame()' besteht darin, dass Sie immer ein neues Spiel starten können, indem Sie 'startGame()' aufrufen und die Spieler werden neu initialisiert. Dies ist wichtig, wenn 'Player' veränderbare Daten wie eine Punktzahl enthält. – Kayaman

+0

jedoch schließt es sich nicht gegenseitig aus. sage ich es restartGame() und initialisiere die Objekte wieder, sollte auch gut funktionieren. – ergonaut

3

An Ihrem ersten Beispiel werden die Objekte nur instanziiert, wenn Sie die Methode startGame() nennen. Vor dem Aufruf dieser Methode sind p1, p2 und p3 gleich null.

In Ihrem zweiten Beispiel deklarieren und instanziieren Sie sie direkt. Sie werden also bei der Erstellung der Klasse instanziiert.

2

1.: Initialisierung bei Methode startGame()

guessgame gg = new guessgame() // Here p1 is null 

2. Platz: in der Klassen

GuessGame GG = new GuessGame() // OK p1 is initialized 
Verwandte Themen