# Zählervariable im Konstruktor inkrementieren?



## suikoden007 (6. Jul 2004)

Hallo zusammen.


Ich würde gerne mit jedes mal, wenn ein Objeklt erzeugt wird, einen Zähler erhöhen, der z.b. die anzahl meiner bisher erzeugten Objekte zählt.

Ich mache das im konstruktor..., da es nicht einer "extra" Methode passieren soll.

Es klappt aber nicht.

Kann es sein, dass man im KOnstruktor keine Inkrementierungsanweisung machen darf???

Wäre super, wenn jemand eine Idee hätte!


----------



## nero (6. Jul 2004)

Das ganze sollte so gehen:


```
class Counter
{
  private static int instanzen;

  public Counter()
  {
    instanzen++;
  }
}
```

die Variable instanzen muss als Klassenvariable definiert werden, damit sich alle Instanzen die selbe Variable teilen


----------



## P3AC3MAK3R (6. Jul 2004)

So müßte es eigentlich funktionieren:


```
public class Klasse {
    private static int anzahlInstanzen = 0;

    public Klasse() {
        anzahlInstanzen++;

        ...
    }
}
```


----------



## L-ectron-X (6. Jul 2004)

Schön wäre es gewesen, wenn Du noch Deinen Konstruktor gepostet hättest.
Grundsätzlich kannst Du auch im Konstruktor eine Anweisung zur Inkrementierung einer Variablen schreiben.
Zum Zählen von Instanzen, die von einer Klasse gemacht wurden, musst Du Deine Zählervariable _static_ deklarieren. Denn statische Variablen gibt es je Klasse nur einmal. Wenn Du sie nicht statisch deklarierst, wird mit jeder Instanz Deiner Klasse auch eine eigene Zählervariable angelegt. Folglich inkrementierst Du immer Variablen unterschiedlicher Instanzen.


----------



## thE_29 (6. Jul 2004)

static Variablen oder überhaupt konstruktor Variablen werden Standardmäßig mit 0 angelegt oder?

Hab mal irgendwann gelernt, wann welche Variable mit 0 initiert wird!


----------



## meez (6. Jul 2004)

thE_29 hat gesagt.:
			
		

> static Variablen oder überhaupt konstruktor Variablen werden Standardmäßig mit 0 angelegt oder?
> 
> Hab mal irgendwann gelernt, wann welche Variable mit 0 initiert wird!



Nein...Die werden nicht definiert, d.h. si sind nicht mal null...


----------



## L-ectron-X (6. Jul 2004)

```
public class MyClass {
  static int i; //i wird mit 0 angelegt
  int j; //j wird mit 0 angelegt
  byte b; //b wird mit 0 angelegt
  long l; //l wird mit 0 angelegt
  double d; //d wird mit 0.0d angelegt
  float f; //f wird mit 0.0f angelegt
  char c; //wird mit '\u0000' angelegt
  Object o; //wird mit null angelegt
...
}
```
Klassenvariablen und Instanzvariablen werden werden automatisch mit Default-Werten initialisiert.
Lokale Variablen werden nicht automatisch initialisert, sie müssen von Hand initialisiert werden.


----------



## meez (6. Jul 2004)

L-ectron-X hat gesagt.:
			
		

> ```
> public class MyClass {
> static int i; //i wird mit 0 angelegt
> int j; //j wird mit 0 angelegt
> ...



Static und Klassenvars schon....Wenn du aber im Konstruktor Vars definierst, sind sie undefined....


----------



## L-ectron-X (6. Jul 2004)

Ja, dann sind's lokale Variablen und müssen initialisiert werden. Klar.


----------



## suikoden007 (6. Jul 2004)

Servus!

Erstmal wieder danke für die schnellen Antworten.

Ja, "static" war mein Problem.

Ich hatte meine Zählvariable als Instanzvariable so deklariert:


```
private int anzahlObjekte = 0;
```

und im KOnstruktor dann:


```
public Objekt()
          {
           //....
           anzahlObjekte++;


          }
```

Ich dachte da auch immer daran, daß anzahlObjekte mit jedem Objekt neu initialisiert wird, aber habe die "Denkkurve" nicht bekommen, daß es eben immer mit Null passiert.

Ich dachte das Inkrementieren im Konstruktor wird auch von der Instanzvariable "verstanden", und Sie wird mit jedem neuen Objekt dann um 1 erhöht!!

DAS funktioniert bei Aufruf im Konstruktor nur mit "static", oder??
Ausserhalb des Konstruktors kann man eine Instanzvariable (nicht static) aber schon permanent ändern, also incrementieren...ich habe das irgendwo schon mal benutzt, und hat auch funktioniert...!

Was da jemand mehr dazu??

Wenn ich bei der Instanzendeklaration das "= 0" weglasse, wird sie per Compiler-Default mit "0" initialiesiert???
Auch neu für mich, aber logisch. 

Nochmals Danke für alle Antworten.


----------



## P3AC3MAK3R (6. Jul 2004)

Auch wenn Variablen bereits automatisch initialisiert werden, kann es nicht schaden, sie selbst zu initialisieren, denn so erhöht man die Lesbarkeit des Quellcodes bzw. die Fehlersuche.


----------



## nero (6. Jul 2004)

werd in Zukunft alle Variablen initialisieren, hab mir nur gedacht wenns eh nicht nötig ist, warum dann?

lg nero


----------

