Java Array[], Klassen und Speicherverbrauch

Katzehuhn

Erfahrenes Mitglied
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;)
 
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
 
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 :

Code:
Object[] objekte = new Object[100];

und alles reinpacken ausser ungewrapte native Datentypen.

Code:
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
 
ah verstehe, ja wenn wir schon dabei sind, wie würdest du die Klassen dann herausklauben? Mit einem switch über
Code:
objekte[i].getClass()
? Danke;)
 
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:

Java:
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());
     }
}
 
Zuletzt bearbeitet:
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
Code:
[i]
.getClass().getName() zu benutzen, um dann die Klasse
über den String zu identifizieren ! Ob's Sinn macht ?

Gruß JAdix
 
Zurück