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.
Ich hab folgende Klasse erstellt und versuche in mein Array Referenzen auf Instanzen dieser zu erzeugen. Der erste Befehl funktioniert, beim 2. meckert der Compiler. In der main-Methode gehen aber beide. Warum ist das so ?
public class Buch {
Buch[]a = new Buch[10];
for (int i=0;i<a.length;i++) a = new Buch();
Ich hab folgende Klasse erstellt und versuche in mein Array Referenzen auf Instanzen dieser zu erzeugen. Der erste Befehl funktioniert, beim 2. meckert der Compiler. In der main-Methode gehen aber beide. Warum ist das so ?
public class Buch {
Buch[]a = new Buch[10];
for (int i=0;i<a.length;i++) a = new Buch();
Weil sich diese Zeilen im Deklarationsbereich der Klasse befinden. Hier könnten nur Variablen deklariert und instanziiert aber kein Code "ausgeführt" werden.
Weil sich diese Zeilen im Deklarationsbereich der Klasse befinden. Hier könnten nur Variablen deklariert und instanziiert aber kein Code "ausgeführt" werden.
public class Buch
{
public static void main(String[] args)
{
// Code wird nur innerhalb von Methoden ausgeführt
Buch[]a = new Buch[10];
for (int i=0;i<a.length;i++)
a[i] = new Buch();
}
}
In deinem Code führst du den Code außerhalb der main-Methode aus. Da dürfte der Compiler dir schon Fehlermeldungen werfen
Code:
In der main-Methode gehen aber beide. Warum ist das so ?
Weil du mit dieser Aussage:
Java:
Buch[]a = new Buch[10];
Nur eine Variable deklarierst und gleich initialisierst. Das kannst du in einer Klassse außerhalb einer Methode machen (normalerweise würde man dann private davor schreiben, damit diese Variable nur innerhalb der Klasse gesehen werden kann).
Die for-Schleife ist Code, der nur innerhalb von Methoden ausgeführt werden kann.
Du kannst außerhalb von Methoden nur eine Variable deklarieren und ihr direkt einen Wert zuweisen.
[Java]
// Gültig, hier wird eine Variable a[] als Array von Buch deklariert und bekommt direkt den Wert zugewiesen
Buch[]a = new Buch[10];
// Ungültig, hier deklarierst Du keine Variablen, sondern versuchst, in einer Schleife
// vielen bereits deklarierten Variablen einen Wert zu zu weisen. Das geht so nicht
for (int i=0;i<a.length;i++) a = new Buch();
[/Java]
Du kannst es aber so machen:
[Java]
Buch[]a = new Buch[10];{
for (int i=0;i<a.length;i++)
a = new Buch();
}
[/Java]
Mit diesem Konstrukt (die geschweiften Klammern) wird die Schleife praktisch Bestandteil der initialen Wertzuweisung. Und so ist der Code gültig.
Du kannst außerhalb von Methoden nur eine Variable deklarieren und ihr direkt einen Wert zuweisen.
[Java]
// Gültig, hier wird eine Variable a[] als Array von Buch deklariert und bekommt direkt den Wert zugewiesen
Buch[]a = new Buch[10];
// Ungültig, hier deklarierst Du keine Variablen, sondern versuchst, in einer Schleife vielen Variablen einen
// Wert zu zu weisen. Das geht so nicht
for (int i=0;i<a.length;i++) a = new Buch();
[/Java]
Du kannst es aber so machen:
[Java]
Buch[]a = new Buch[10];{
for (int i=0;i<a.length;i++)
a = new Buch();
}
[/Java]
Mit diesem Konstrukt (die geschweiften Klammern) wird die Schleife praktisch Bestandteil der initialen Wertzuweisung. Und so ist der Code gültig.
Da kann ich nur spekulieren. Solche von Dir gewünschten Konstrukte sind in einigen (meist funktionalen) Sprachen ja möglich. Ich denke, es liegt daran, dass bei Java als objektorientierter Sprache konzeptionell sehr stark zwischen Daten und Funktionalität getrennt wird. Daten werden über Variablen abgebildet und Funktionalität über Methoden. Die Trennung ist so stark ausgeprägt, dass die JDK-Entwickler die Syntaxregeln so definiert haben, dass man das nicht vermischen kann.
Diese Art der Einrückung würde ich nicht empfehlen, lieber neue Zeile für den Block nehmen:
Java:
class Blah{
static {
System.out.println("this is executed when the class is loaded");
}
{
System.out.println("this is executed when an instance is created");
}
}