# Objekte initialisieren und deklarieren



## wSam (26. März 2007)

Hallo zusammen

Warum hat man die möglichkeit ein Objekt folgendermassen zu initialisieren?:


```
Integer int1;
```

Mann kann ja ohne int1 = null zu setzten nicht auf dieses Objekt zugreifen.


```
Integer int1;
    Integer int2 = int1;  // Fehler
```

Wenn ich aber eine Klasse habe und per Getter Methode auf eine nicht initialisierte Member Variable zugreiffen will, liefert mir dies ja null zurück!


```
public class Bean {
  private User m_user;

  public User getUser() {
    return m_user;   // Liefert null zurück
  }
}
```

Warum hat man also die Möglichkeit ein Objekt mit Integer int1; zu erstellen, obschon man es ja gar nie benutzen kann, ohne etwas zuzuweisen?

Vielen Dank im Voraus und Gruss


----------



## Thomas Darimont (26. März 2007)

Hallo,

Instanzvariablen werden bei der Deklaration automatisch mit den entsprechenden Default Werten initialisiert (null -> für Referenztypen und die entsprechenden Standardwerte für primitive (boolean, byte,short, char, int, long, float, double). Lokale Variablen (Variablen innerhalb einer Methode / eines Codeblocks) hingegen werden nicht automatisch initialisiert -> das muss man dann von Hand machen.

Gruß Tom


----------



## fr_osch (26. März 2007)

wSam hat gesagt.:


> Hallo zusammen
> 
> Warum hat man die möglichkeit ein Objekt folgendermassen zu initialisieren?:
> 
> ...



Das Objekt ist erstmal nicht vorhanden, nur die Variable ist deklariert. Erst nach einer Zuweisung gibt es Inhalt (auch wenn der null sein sollte).

Das macht man deshalb, weil man die Variable über Blöcke hinaus verwenden will:


```
Integer int1;
int x = 12;
if (...bedingung1...) {
    int1 = new Integer(x*22);
} else {
    int1 = new Integer(x*50);
}
System.out.println(in1.toString());
```

Würde die Variable nur innerhalb der IF-Blöcke deklariert, wäre sie danach nicht mehr zugreifbar, weil eben nur innerhalb der Blöcke gültig.

Gruß
    fr_osch


----------



## wSam (26. März 2007)

@Tom

Und warum werden die lokalen Variablen nicht automatisch initialisiert? Es ist doch eigentlich überflüssig, dass man die selber initialisieren muss? Könnte doch auch defaultmässig auf null gesetzt werden? Das ist der Punkt, welcher mir nicht einleuchtet.


----------



## fr_osch (26. März 2007)

Tja, das wissen die Götter (bei Sun;-)

Allenfalls könnte die Variable mit null initialisiert werden - damit würden dann aber alle Methodenaufrufe immer noch nicht funktionieren. Ich habe mir angewöhnt, immer ein " = null" hinten dran zu setzen - zumal mich Eclipse auch warnt, wenn Variablen eventuell uninitalisiert verwendet werden.

Gruß
    fr_osch


----------



## Thomas Darimont (26. März 2007)

Hallo,

alle Details zu Variablen initialisierung von java findet man in der Java Language Specification (aktuell in der dritten Auflage):

Schau mal hier:
http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.12.5

Gruß Tom


----------



## wSam (27. März 2007)

@fr_osch

Ist wohl wirklich der Grund, mit dem if-else Block, scheint mir am einleuchtendsten.




> Lokale Variablen (Variablen innerhalb einer Methode / eines Codeblocks) hingegen werden nicht automatisch initialisiert -> das muss man dann von Hand machen.



Aber so ganz klar ist es mir immer noch nicht, warum man lokale Variablen von Hand initialisieren muss.


----------



## WeirdAl (27. März 2007)

Huhu,
evtl. hats ja damit was zu tun, dass die lokalen Variablen auf dem Stack liegen und die globalen auf den Heap kommen. Das ist aber nun sehr gewagtes Halbwissen von mir und ist rein spekulativ zu sehen


----------

