# Referenzen zu Instanzen einer Klasse im Array



## cryblood (31. Aug 2011)

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();   

     public static void main(String[] args) {

}
    }_


----------



## Michael... (31. Aug 2011)

cryblood hat gesagt.:


> 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 {
> 
> ...


_
Weil sich diese Zeilen im Deklarationsbereich der Klasse befinden. Hier könnten nur Variablen deklariert und instanziiert aber kein Code "ausgeführt" werden._


----------



## Volvagia (31. Aug 2011)

Weil du keine Schleife mitten in der Klasse außerhalb jeder Methode ausführen kannst? :autsch:


----------



## cryblood (31. Aug 2011)

Volvagia hat gesagt.:


> Weil du keine Schleife mitten in der Klasse außerhalb jeder Methode ausführen kannst? :autsch:


Nee die Schleife ist nicht der Grund.



> Weil sich diese Zeilen im Deklarationsbereich der Klasse befinden. Hier könnten nur Variablen deklariert und instanziiert aber kein Code "ausgeführt" werden.



Was meinst du mit "kein Code ausgeführt werden" ?

ist "a_ = new Buch();" keine Instanziierung?
was ist der unterschied zu dem hier ? Buch b = new Buch(); ? <--- das geht nämlich_


----------



## njans (31. Aug 2011)

Habs mal etwas eingrrückt 


```
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 


```
In der main-Methode gehen aber beide. Warum ist das so ?
```
Weil du mit dieser Aussage: 

```
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.


----------



## nillehammer (31. Aug 2011)

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._


----------



## cryblood (31. Aug 2011)

nillehammer hat gesagt.:


> 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];
> ...


_
Du hast mich verstanden, danke ! Vielleicht hatte ich meine Frage etwas missverständlich ausgedrückt. Hätte auch schreiben können:

Buch a = new Buch();  <-- geht

Buch[]a = new Buch[10];
a[3] = new Buch(); <-- geht nicht




			Du kannst außerhalb von Methoden nur eine Variable deklarieren und ihr direkt einen Wert zuweisen.
		
Zum Vergrößern anklicken....


Ok, das war der Satz den ich gebraucht habe. Kannst du mir auch erklären warum das so ist ? Also welchen Sinn diese Konvention hat ?_


----------



## nillehammer (31. Aug 2011)

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.


----------



## 0x7F800000 (31. Aug 2011)

nillehammer hat gesagt.:


> Du kannst es aber so machen:
> [Java]
> Buch[]a = new Buch[10];{
> for (int i=0;i<a.length;i++)
> ...


_
Diese Art der Einrückung würde ich nicht empfehlen, lieber neue Zeile für den Block nehmen:


		Java:In die Zwischenablage kopieren


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");
  }
}

oder sogar so:


		Java:In die Zwischenablage kopieren


X blah = new X(){
  {
    callMethodOfX();
  }
}


"Initialization Block" nennt sich das ganze..._


----------

