# Instanz-Felder einer Klasse initialisieren



## jakob190590 (22. Dez 2008)

Hallo

wo initialisiert man denn die Felder einer Klasse? Ich meine natürlich nicht die static-Felder, sondern die für jede einzelne Instanz.

sollte man eine init()-Methode schreiben, oder alle, auch Objekte gleich bei der deklaration initialisieren?

Danke schon mal


----------



## Gast (22. Dez 2008)

Initialisierungen werden normalerweise direkt im Konstruktor gemacht. 

Gegebenenfalls macht auch eine so gennate lazy initialization Sinn. Dass bedeute, die Instanzvariable wird erst gesetzt, wenn sie auch benötigt wird. Dies ist aber eher die Ausnahme und macht nur dann Sinn wenn die Initialisierung rechenintensiv o.ä ist.


----------



## jakob190590 (22. Dez 2008)

gut, im Konstruktor also. Geht es theoretisch auf diese Weise auch?:

```
class Example {
	private long delay = 100;
	private boolean cheat = false;
	private boolean ki = false;
	private boolean wandDurchgang = false;
}
```

-----------------------------

und bei einem Applet (
	
	
	
	





```
class test extends applet {}
```
) z.B.: da rufe ich ja nicht selbst den Konstruktor auf
Wenn ich aber einen schreibe (für die initialisierung), kann ich dann sicher sein, dass er aufgerufen wird?


----------



## Marco13 (22. Dez 2008)

Wenn ein Objekt erstellt wird (egal, ob applet oder nicht) wird _irgendein_ konstruktor aufgerufen. Im Zweifelsfall der, der keine Argumente hat. Und die Initialisierungen kann man ggf. in eben diesem Konstruktor machen. 

Die erste Option (die Felder direkt initialisieren) geht auch. Eine init-Methode kann aber sinnvoll sein, wenn es mehrere Konstruktoren gibt und/oder die initialisierung von einer abgeleiteten Klasse gemacht werden soll. Auf jeden fall sollte man NICHT die gleichen initialisierungen in mehreren Konstruktoren schreiben - dann "immer" eine init-Methode verwenden.


----------



## jakob190590 (22. Dez 2008)

ok, vielen Dank!


----------



## didjitalist (22. Dez 2008)

statt init methode sind initializer manchmal auch ganz praktisch. besonderns dann, wenn man ein feld als final deklarieren möchte.


```
public class Foo
{
   private final long val;

   {
       // code der hier steht, wird vor dem konstruktor gerufen
       val = 23;
   }

   public Foo()
   {
       // konstruktor zeugs
   }
}
```


----------



## Landei (23. Dez 2008)

> ...besonderns dann, wenn man ein feld als final deklarieren möchte.



???

Natürlich geht auch

```
public class Foo 
{ 
   private final long val; 

   public Foo() 
   { 
       val = 23; 
   } 
}
```

Wo initializer wirklich helfen, sind anonyme Klassen:

```
Action action = new AbstractAction("ACTION!!!") {
  {
       putValue(SHORT_DESCRIPTION, "an Action"); 
       putValue(MNEMONIC_KEY, 42);
  }

}
```


----------

