# Mehrere Objekte mit einer Methode ausgeben



## chillerStudent (12. Jan 2012)

Guten Tag,

ich habe bei der OO-Prog mehrere Objekte erstellt. Ich möchte nun, dass alle Objekte ausgegeben werden. Wie geht das? 
Danke schon mal für eure hilfe


----------



## njans (12. Jan 2012)

Ausgeben in welcher Form? 
Als Rückgabewert? Sind es denn Objekte des gleichen Typs? 
Oder als Ausgabe auf die Konsole ?


----------



## chillerStudent (12. Jan 2012)

njans hat gesagt.:


> Ausgeben in welcher Form?
> Als Rückgabewert? Sind es denn Objekte des gleichen Typs?
> Oder als Ausgabe auf die Konsole ?



Ja, alle Objekte sind vom gleichen Typ und die ausgabe soll auf die Konsole erfolgen.

Edit:

die Methode muss statisch sein.


----------



## njans (12. Jan 2012)

So etwas? 

```
public static void printMyObjects(MyClass[] objectArray)
{
  for (MyClass object: objectArray)
  {
    System.out.println(object.toString()); // toString muss evtl. in der Klasse MyClass überschrieben werden
  }

}
```


----------



## chillerStudent (12. Jan 2012)

Nein.
Ich habe drei variablen(class x) und mehrere konstruktoren. Konstruktoren werden in main mehrmals aufgerufen. die drei variablen sind vom typ string int int. Die ausgabemethode hat keinen parameter:



```
//class X
static void ausgabe() {

}
```


```
// main

X a = new X();
X b = new X("s", 2);
X c = new X("s", 2, 4);

b.anzeigen(); // das hab ich hinbekommen, also nur b ausgeben

X.ausgabe(); // hier soll er a, b und c ausgben.
```


----------



## Gast2 (12. Jan 2012)

Du müsstest alle Instanzen in einer statischen liste speichern. Im Konstruktor fügst du die Instanzen dann in für liste.

Aber wofür brauchst du so was?


----------



## njans (12. Jan 2012)

Ich nenne die drei werte einfach mal: inputString, inputIntEins, inputIntZwei.
anzumerken ist, dass ich davon ausgehe, dass du nicht übergebene(durch den Konstruktor als Parameter übergeben) Werte mit null und -1 initialisierst.


```
static void ausgabe() {
System.out.println("inputString: " + ((inputString == null)?"":inputString));
System.out.println("inputIntEins: " + ((inputIntEins== -1)?"":inputIntEins));
System.out.println("inputIntZwei: " + ((inputIntZwei== -1)?"":inputIntZwei));
}
```

Vermutlich willst du das das println gar nicht angezeigt wird, würde aber durch Umformen auch gehen 

EDIT: komplett falsch aufgefasst, ich glaub ich geh nun mal schlafen ^^


----------



## chillerStudent (12. Jan 2012)

EikeB hat gesagt.:


> Du müsstest alle Instanzen in einer statischen liste speichern. Im Konstruktor fügst du die Instanzen dann in für liste.
> 
> Aber wofür brauchst du so was?



Was du mit liste meinst, weiß ich nicht, aber ich denke ich soll die instanzen alle statisch deklarieren. Das problem ist, wenn ich die statisch deklariere, dann werden diese instanzen in konstruktoren nicht benutzt. Sind aber sichtbar.

Ich muss die Instanzen in konstruktoren, in nicht statischen methoden und in statischen methoden benutzen. 

Wofür ich das brauche? Hausaufgaben


----------



## njans (12. Jan 2012)

Mit Liste meint er z.B. ArrayList oder LinkedList. Eben alles, was das Interface implementiert.
Generell musst du bei der Erstellung eines neuen Objektes im Konstruktor direkt das Objekt zu einer statischen Liste hinzufügen. 
Und dann bei X.ausgabe() mit einer Schleife über die Liste gehen und diese Ausgeben.


----------



## chillerStudent (12. Jan 2012)

njans hat gesagt.:


> Mit Liste meint er z.B. ArrayList oder LinkedList. Eben alles, was das Interface implementiert.
> Generell musst du bei der Erstellung eines neuen Objektes im Konstruktor direkt das Objekt zu einer statischen Liste hinzufügen.
> Und dann bei X.ausgabe() mit einer Schleife über die Liste gehen und diese Ausgeben.



Genau so ähnlich habe ich das im Kopf. Leider hab ich nie mit Listen gearbeitet. 
Also ich muss die zwischen werte irgendwo speichern, dann mittels einer schleife ausgeben lassen. Es gibt doch bestimmt eine andere möglichkeit.


----------



## njans (12. Jan 2012)

```
// Liste erzeugen
ArrayList<X> liste = new ArrayList<X>();

//Einfügen z.B. a
liste.add(a);

//Zugriff z.B. über for-Schleife mit Laufvariable i
liste.get(i)
```


----------



## Firephoenix (12. Jan 2012)

Wenn es für eine Hausaufgabe ist wäre unter umständen auch die Aufgabenstellung oder ein Coderahmen hilfreich  Aus einem Kontext heraus kann man sowas leichter einschätzen als zu sagen "ich habe 3 instanzen von X und brauche die in Konstruktoren, statischen und nicht statischen Methoden und brauche noch sowas wie eine Ausgabe in Y die alle Instanzen aus X ausgibt"
Gruß


----------



## chillerStudent (12. Jan 2012)

Hier ein Beispiel:


```
class Rechteck {
int height, width, x, y;
Rechteck() { x = y = 1; }
Rechteck(int height) { this(); this.height = height;}
Rechteck(int height, int width) {
this(height); this.width = width;
}
static void ausgeben(){
??
}
}
```


```
//main class
Rechteck r1 = new Rechteck();
Rechteck r2 = new Rechteck(7);
Rechteck r3 = new Rechteck(7,8);

//Ausgabe
Rechteck.ausgeben();  // hier möchte ich, dass alles ausgegeben wird, was in r1, r2 und r3 gespeichert wurde als System.out...
```


----------



## Firephoenix (12. Jan 2012)

Ok, also wenn ich das richtig verstehe hast du die Klasse Rechteck
Im Programmverlauf erzeugst du Instanzen der Klasse, zu einen Zeitpunkt X rufst du auf der Klasse Rechteck .ausgeben(); auf. Diese Methode soll alle aktuellen Instanzen die vorhanden sind nacheinander ausgeben.

Dann bietet es sich an in der Klasse Rechteck eine statische List anzulegen die Rechteck-instanzen speichert.
Da deine Konstruktoren sowieso immer den parameterlosen Konstruktor aufrufen kannst du einfach als letzten Aufruf in diesem die gerade erzeugte instanz (this) zu der liste hinzufügen.

Bei der statischen Funktion ausgeben hast du Zugriff auf die Liste und kannst per for /for-each -Schleife über die Instanzen iterieren. Dann setzt du dir einfach aus den Werten der aktuellen Instanz einen String zusammen und gibst diesen aus.

Noch einfacher geht es wenn du in der Klasse Rechteck die von Object geerbte Methode toString überschreibst, dann kannst du nämlich das rechteck direkt in den println() Aufruf einsetzen.

Hoffe das ist in etwa das was du brauchst 

Gruß


----------



## chillerStudent (13. Jan 2012)

@firephoenix

Also das Problem hast sehr gut verstanden. Aber wie schon gesagt hab ich noch nie mit listen gearbeitet bzw ich darf diese nicht benutzen, weil noch nicht behandelt. Deswegen muss es einen anderen weg geben.


----------



## Firephoenix (13. Jan 2012)

Dann bleibt eigentlich nur noch das Array als brauchbare Datenstruktur, das würde auch dem Ansatz von njans entsprechen.
Denn da du zur Laufzeit nicht weißt wieviele Instanzen erzeugt werden musst du natürlich die Möglichkeit bereitstellen mehrere zu speichern.
Mit etwas umkopieren kann man ein Array auch ohne viel Aufwand als dynamische Liste benutzen wenn man List selbst nicht benutzen darf.
Gruß


----------



## chillerStudent (13. Jan 2012)

Firephoenix hat gesagt.:


> Dann bleibt eigentlich nur noch das Array als brauchbare Datenstruktur, das würde auch dem Ansatz von njans entsprechen.
> Denn da du zur Laufzeit nicht weißt wieviele Instanzen erzeugt werden musst du natürlich die Möglichkeit bereitstellen mehrere zu speichern.
> Mit etwas umkopieren kann man ein Array auch ohne viel Aufwand als dynamische Liste benutzen wenn man List selbst nicht benutzen darf.
> Gruß



Das bringt mich auf eine (schöne) idee. Idee==StringBuffer 
mal gucken was dabei rauskommt


----------



## chillerStudent (13. Jan 2012)

Alles richtig gemacht. :toll: Mit StringBuffer hats geklappt.
Danke an alle die mir geholfen haben. Besonderen dank an firephoenix, der mich auf diese idee gebracht hat, auch wenn diese für ein oder anderen nicht die richtige ist.


----------

