# Java Array[], Klassen und Speicherverbrauch



## Katzehuhn (15. Februar 2008)

Nehmen wir mal an ich hab eine Klasse Auto. Dann gibt es die Klasse Autobus und Amphibienfahrzeug. 
Jetzt definiere ich ein Array Auto[] autos = new Auto[100];
Java reserviert sich ja für Array[] fix einen Speicher. Nur was macht Java wenn ich dem Array autos jetzt autos[12] = new Autobus(parm1,parm2...); hinzufüge? 
Würd mich interssieren


----------



## TheJadix (15. Februar 2008)

Hallo,

ist doch logisch, der Autobus kriegt mächtig Schrammen, weil er zu groß ist 
für den Auto-Parkplatz ! 

Nein mal im ernst !

Ein Java-Array arbeitet auf basis von Objekt-Referenzen da braucht man keine
sorgen haben das ein Objekt welches mehr Speicher benötigt nicht ins Array
passt oder gar etwas anderes überschreibt oder ähnliches !

Gruß JAdix


----------



## Katzehuhn (15. Februar 2008)

Wieso will das Java Array dann wissen wieviele Einträge es hat?^^ Aber danke ma^^


----------



## TheJadix (15. Februar 2008)

Hallo nochmal,

das Array ist halt der Größe nach ein sehr statisches Gebilde !

Für den Fall dass es irgendwelche Objekte speichern soll, muß es eben wissen
für wieviele Objektreferenzen Speicher zur verfühgung stehen muß !

Die Objekte selbst werden natürlich ganz wo anders im Speicher abgelegt,
die Einträge des Arrays verweisen lediglich auf diese Objekte !
(Man könnte den bösen Begriff "Pointer" nennen, aber den mögen wir
Java-nesen ja gar nicht !)

Als Beispiel kann man ein Array vom Typ Object nehmen :


```
Object[] objekte = new Object[100];
```

und alles reinpacken ausser ungewrapte native Datentypen.


```
objekte[0] = new Point(10,5);
objekte[1] = new Frame("Sehr sinnvoll !");
objekte[2] = new Integer(12345);
```

das herausklauben ist dann natürlich ein anderes Problem ! (instanceof und casting)

Noch fragen 

Gruß JAdix


----------



## Katzehuhn (16. Februar 2008)

ah verstehe, ja wenn wir schon dabei sind, wie würdest du die Klassen dann herausklauben? Mit einem switch über 
	
	
	



```
objekte[i].getClass()
```
 ? Danke


----------



## zeja (16. Februar 2008)

Im Array steht also nur die Speicheradresse des Objektes und nicht das Objekt selbst. Die Größe einer Speicheradresse ist bekannt und somit wird das Array mit n mal dieser Größer angelegt.

Objekte wieder rauskriegen geht so:


```
Object[] objekte = new Object[100];
objekte[0] = new Point(10,5);
objekte[1] = new Frame("Sehr sinnvoll !");
objekte[2] = new Integer(12345);

for(int i = 0; i < objekte.length; i++){
     Object objekt = objekte[i];
     if(objekt instanceof Point){
          Point p = (Point) objekt;
     }
     else if(objekt instanceof Frame){
          Frame f = (Frame) objekt;
     }
         ... usw.
     else {
         System.out.println("Unknown Object at position "+ i +": " + objekt.getClass().getName());
     }
}
```


----------



## TheJadix (16. Februar 2008)

Hallo nochmal,

Zeja hat es ja schon sehr schön beschrieben wie es geht ! !

Die Idee mit dem switch-case ist zwar toll, aber geht so garnicht !

Java lässt nur primitive Datentypen zur Fallunterscheidung zu !

Die möglichkeit über objekte.getClass() ist zwar möglich,
ich sehe dort aber keinen Vorteil gegenüber der instanceof-Technik !

Evtl. könnte man einen interessanten Sonderfall konstruieren bei dem es
Sinn macht objekte
	
	
	



```
[i]
```
.getClass().getName() zu benutzen, um dann die Klasse
über den String zu identifizieren ! Ob's Sinn macht ?

Gruß JAdix


----------

