# Ausgabe auf dem Bildschirm



## Poldy79 (20. Nov 2009)

Hallo ich bin gerade dabei mich anhand eines Buches "Java als erste Programmiersprache" in die Programmierung mit Java einzuarbeiten.
dabei bin ich auf folgendes Problem gestossen.
ich habe zum einen die Klasse Status

```
public class Status {

	private String name;
	public Status Wartend;
	public Status Landeanflug;
	public Status Gelandet;
	public Status Geparkt;
	public Status Startvorbereitung;
	public Status Gestartet;
	
	private Status (){
		
	}
	public void toString(){

	}	
}
```

und zum anderen die Klasse Flugzeug


```
private Fluggesellschaft fluggesellschaft;
private String flugnummer;
private Flugzeugtyp flugzeugtyp;
private int anzahlFlugzeuge = 0;
private String istzeitLandung;
private String istzeitStart;
private Bahn landebahn;
private Parkstelle parkstelle;
private String sollzeitLandung;
private String sollzeitStart;
private Bahn startbahn;
private Status status;

public Flugzeug (String typ, String gesellschaftsname,String gesellschaftsstrasse, String gesellschaftsort, String sollzeitLandung){
anzahlFlugzeuge++;
flugzeugtyp = new Flugzeugtyp(typ);
fluggesellschaft = new Fluggesellschaft(gesellschaftsname,gesellschaftsstrasse, gesellschaftsort);
this.sollzeitLandung = sollzeitLandung;
flugnummer = "MI " + anzahlFlugzeuge;
?????
print();
System.out.println("geplante Landezeit: "+ sollzeitLandung);
System.out.println("");
}
```
die Methode print sieht wie folgt aus:

```
public void print(){
		System.out.println("Flugzeug "+flugnummer +" befindet sich im Status "+status.getStatus() +".");
		System.out.println("Es ist vom Typ " +flugzeugtyp +" und gehört der Gesellschaft "+fluggesellschaft +".");
	}
```
wenn ich jetzt ein Objekt der Klasse Flugzeug erzeuge möchte ich an der Stell wo die ??? sind ,den Status auf "wartend" setzen und diesen dann auf dem Bildschirm ausgeben.
Frage ist wie ich das mache?


----------



## 0din (20. Nov 2009)

das problem is jetz schon das des ganze ehr richtung rekursion geht... un ich will bezweifeln das du das wolltest...

daher mein erster vorschlag;
den jwl. status in der klasse Status nicht mit einzelnen variablen des typs Status bei halten sondern in form vonnem string, int oder bool
fußnote: ich würde den int nehmen, dann muss ich zwar den int in nen string umwandeln aber brauch dafür nur eine variable bei halten

nur zu deiner Status klasse;
1. dem konstruktor gleich den namen mit geben

```
public Status(String name)
{
this.name = name;
}
```

2. deine toString methode wird so nicht funktioniern (du kannst im besten fall nur die namen anderer Status klassen bekommen)


ich hab grad zeit un werd ma fix hier im forum was "proggen"... ^^ 


```
public class Status {
 
    private String name;
    private int state;
    
    private Status (String name)
    {
        this.name = name;
    }

    public void setState(int state)
    {
          this.state = state;
    }

    public int getState()
    {
          return state;
     }

    public void toString()
    {
        switch(state)
        {
               case 1:
                        {
                              return "Status ist Wartend";
                         }
                //etc...
         }
    }   
}
```


----------



## Poldy79 (20. Nov 2009)

danke für deinen lösungsansatz!

der funktioniert so super, löst allerdings nicht mein Verständnisproblem 
Dieses liegt darin, dass ich nicht verstehe wie ich zum Beispiel in der Klasse Flugzeug eine Instanz der Klasse Status als String ausgebe.
Ich vermute das dieses über die Methode toString möglich ist nur weiss ich leider nicht wie. Das gleiche Problem hätte ich zum Beispiel bei der Klasse Flugzeugty

```
public class Flugzeugtyp {

	private String bezeichnung;
	
	public Flugzeugtyp(String bezeichnung){
		this.bezeichnung= bezeichnung;
	}
}
```
auch hier soll eine toString Methode geschrieben werden. Bisher ist es bei mir so, dass ich beim erzeugen eines Objektes der Klasse Flugzeug ein Objekt der Klasse Flugzeugtyp erzeuge und dort auch den String bezeichnung zuordne. wenn ich mir jedoch nach Zeile 21 den Flugzeugtyp ausgeben lasse bekomme ich logischerweise lediglich den speicherort ausgegeben nicht aber den String bezeichnung.


----------



## KrokoDiehl (20. Nov 2009)

In einer Ausgabe der Art:

```
System.out.println("Mein Objekt ist "+object+".");
```
wird, egal welcher Art _object _ist, die 
	
	
	
	





```
toString()
```
-Methode aufgerufen, um das Objekt auf der Konsole auszugeben.

Bei deiner _Status_-Klasse musst du daher die 
	
	
	
	





```
toString()
```
-Methode entsprechend implementieren, zB so wie _0din_ es angegeben hat:

```
public class Status
{
    ...
    public String toString()
    {
        switch( state )
        {
            case 0: return "wartend";
            case 1: return "im Landeanflug";
            ...
        }
    }
}
```

Wenn du das hast, brauchst du in der 
	
	
	
	





```
print()
```
-Methode deines _Flugzeugs _nur noch auf das _Status_-Attribut zugreifen:

```
public class Flugzeug
{
    ...
    private Status meinStatus;
    ...
    public void print()
    {
        ...
        System.out.println("Ich habe den Status "+meinStatus+".");
        ...
    }
}
```

Bei deinem _Flugzeugtyp _sieht das ähnlich aus. in 
	
	
	
	





```
toString()
```
 musst du das zurückgeben, was den _Flugzeugtyp _benennt:

```
public class Flugzeugtyp {
 
    private String bezeichnung;
    
    public Flugzeugtyp(String bezeichnung){
        this.bezeichnung= bezeichnung;
    }

    public String toString()
    {
        return bezeichnung;
    }
}
```


----------



## ARadauer (20. Nov 2009)

Ich hab früher öfters sowas in der Art gemacht...

```
public class Status{

   public final static int WARTEND =0;
   public final static int IM_LANDEANFLUG =1;
   public final static int GELANDET =2;
   public final static int GEPARKT =3;

   public final static String[] NAMES = {"wartend", "im landeanflug", "gelandet", "geparkt"};

   private int state;
   
   public Status(int state) {
      super();
      this.state = state;
   }

   public int getState() {
      return state;
   }

   public void setState(int state) {
      this.state = state;
   }
   public String toString() {
      if(state <0 || state  >= NAMES.length)
         return "";
      return NAMES[state];     
   }
   
   
   public static void main(String[] args) {
      Status status = new Status(Status.IM_LANDEANFLUG);
      System.out.println(status);
   }
}
```

Alternativ sind hier aber Enums die bessere Wahl...


----------



## Poldy79 (20. Nov 2009)

ich habe meine Klasse Status jetzt wie folgt geändert:

```
public class Status {

	private int state;
	private String name;
	public Status Wartend;
	public Status Landeanflug;
	public Status Gelandet;
	public Status Geparkt;
	public Status Startvorbereitung;
	public Status Gestartet;
	
	private Status (){
		
	}
	public String toString(){
		switch( state )
        {
            case 0: return "Wartend";
            case 1: return "Landeanflug";
            case 3: return "Gelandet";
            case 4: return "Geparkt";
            case 5: return "Startvorbereitung";
            case 6: return "Gestartet";
        }

	}
	
}
```
zum einen sagt er mir jetzt das die Methode toString einen String als Rückgabewert erwartet. den er ja eigenentlich bekommt und zum anderen ist mir bei dieser variation noch nicht verständlich wie ich dann in der Klasse Flugzeug den Status entsprechend setzen kann


----------



## Final_Striker (20. Nov 2009)

Eine Klasse Status die Attribute vom Typ Status hat macht hier keinen Sinn.


----------



## KrokoDiehl (20. Nov 2009)

Im _switch()_ musst du noch den _s_Fall abfangen oder am Ende der Methode ein return hinzufügen:

```
switch(state)
{
    ...
    default: return "unbekannter Wert";
}

// oder
switch(state)
{
    ...
}
return "unbekannter Wert";
```

Aber mal allgemein:
In dieser Methodik ist der Status über eine Zahl definiert. Was welche Zahl bedeutet, legst du in der 
	
	
	
	





```
toString()
```
-Methode fest, sprich eine 0 bedeutet "wartend".

Bei der Erstellung eines Status muss du daher noch eine entsprechende Zahl angeben, die den konkreten Status beschreibt:

```
public class Status
{
    protected int meinStatus = -1;
    
    public Status(int status)
    {
        meinStatus = status;
    }

    public void setStatus(int status)
    {
        meinStatus = status;
    }

    public String toString()
    {
        ...
    }
}
```
Die anderen Status-Objekte brauchst du dann nicht mehr.
Oder du machst es wie _ARadauer _über Definitionen oder über _enum_s.


----------



## ARadauer (20. Nov 2009)

> den er ja eigenentlich bekommt


echt? was gibst du bei 7 zurück?


----------



## 0din (20. Nov 2009)

Poldy79 hat gesagt.:


> zum einen sagt er mir jetzt das die Methode toString einen String als Rückgabewert erwartet. den er ja eigenentlich bekommt und zum anderen ist mir bei dieser variation noch nicht verständlich wie ich dann in der Klasse Flugzeug den Status entsprechend setzen kann



zum einen den default case einbaun wie KrokoDiehl schon sagte...

in deiner klasse Flugzeug kannste den status mit status.setState(int state) ändern (siehe meinen ersten post)
also du rufst bei deinem status objekt die methode setState an


----------

