Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
public Board() {
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);
ingame = true;
setSize(400, 300);
craft = new Craft();
initAliens();
timer = new Timer(5, this);
timer.start();
}
Weiter oben ist die Referenzvariable timer so deklariert:
Java:
private Timer timer;
. Ok, damit ist die Variable vom Typ Timer. In dem Konstruktor Board weiß Java jetzt also, Variable timer ist von dem Typ Timer, sodass ich nicht Timer dahinter schreiben muss.
Aber den Sinn versteh ich nicht ganz. Warum nicht außerhalb des Konstruktors "einfach"
Java:
Timer timer1 = new Timer(7,this);
schreiben.
Ich denke, dass hat dann mit der Methode von Timer zu tun. Denn wenn ich außerhalb des Konst. auch
Java:
timer1.start();
schreibe, gibt mir Java ein Fehler:
Syntax error on token "start", Identifier expected after this token
Ich tapp da gerade ziemlich im Dunkel, über eine Erleuchtung wäre ich dankbar
Weil zu dieser Zeit ja noch keine Instanz der Klasse vorhanden ist. Das, was du da oben mit Timer timer machst, ist ja nur, dass du sagst, es gibt diese Varaiable, die folgenden Speicherplatz benötigt. Also lieber Compiler, mach mir mal bitte so viel Platz frei, den werd ich dann später noch brauchen. Alles, was über dem Konstruktor steht, sind nur Definitionen, dort kannst du nicht auf aktuelle Werte (z.B. this) zurückgreifen...
du kannst das schon ausserhalb des Konstruktors ausführen, aber nur INNERHALB von Metoden. Sollte timer zu dem Zeitpunkt nicht belegt sein, gibts eine entsprechende Fehlermeldung.
Stimmt so ja nicht ganz, da es ja auch noch sowas wie Init-Blöcke gibt:
Java:
class Board{
private Timer timer;
// Init-Block:
{
timer = new Timer();
System.out.println("Timer instantiated");
}
}
Wichtig: Init-Blöcke werden zusammen mit der Instanz-Variablen-Initialisierung ausgeführt. Du musst also aufpassen wo genau solch ein Block sich befindet. In diesem Bsp wär's egal, aber das hier ginge zB nicht:
Java:
class Board{
// Init-Block:
{
System.out.println(timer.toString()); // Compile Error: timer nicht initialisiert (ist nicht null, sondern NIX)
}
private Timer timer = new Timer();
}
Wichtig: Init-Blöcke werden zusammen mit der Instanz-Variablen-Initialisierung ausgeführt. Du musst also aufpassen wo genau solch ein Block sich befindet. In diesem Bsp wär's egal, aber das hier ginge zB nicht:
Ach, jetzt les ich erst was ihr hier alles geschrieben habt...
Weil zu dieser Zeit ja noch keine Instanz der Klasse vorhanden ist. Das, was du da oben mit Timer timer machst, ist ja nur, dass du sagst, es gibt diese Varaiable, die folgenden Speicherplatz benötigt. Also lieber Compiler, mach mir mal bitte so viel Platz frei, den werd ich dann später noch brauchen. Alles, was über dem Konstruktor steht, sind nur Definitionen, dort kannst du nicht auf aktuelle Werte (z.B. this) zurückgreifen..
Ihr wisst scheinbar nicht, wie die Instanz-Initialisierung abläuft: Im ersten Schritt (naja, eigentlich dem zweiten, aber ich lass die Vererbungshierarchie jetzt mal aus dem Spiel) wird das Objekt ("this") zusammengebaut. Das bedeutet dass alle Instanz-Variablen erzeugt werden. (Erstmal ohne Wert - womit ich nicht meine mit "null", sondern OHNE IRGENDEINEN WERT). Nach diesem Schritt existiert "this" bereits. Im zweiten Schritt werden nun die Instanz-Variablen initialisiert. Entweder mit dem Default-Wert, wenn es keine explizite Zuweisung gibt, oder mit dem Wert, der explizit zugewiesen wird. Jetzt kann es natürlich zu Laufzeitfehlern kommen, zB NullPointerException, wenn man da nicht nachdenkt:
Java:
private String s;
private String s2 = s + "(2)";
Aber "this" gibt's immer. Also folgendes geht durchaus:
Java:
class MyClass implements ActionListener{
private Timer timer;
{
timer = new Timer(5, this);
}
// ...
}
Und diese Zuweisung funktioniert übrigens genauso auch im Konstruktor.
Ich hab dir ja gesagt das ist ein Ding der Unmöglichkeit. Wer nichts falschen schreiben würde wäre ja der vollständig ausgelernte Java-Entwickler, und sowas gibt es nicht.
PS: Geh mal auf meine Website, im Player kannst du rechts die Playlist aufklappen, und dort wählst du das letzte Video aus der Playlist an (Instanz-Initialisierung). Dort wird ganz genau erklärt wie das funktionert.
(Der dort erwähnte erste verschwiegene Schritt ist der implizite super()-Aufruf. Vererbung kommt da erst viel später)