# Vererbung in Java ( Schiffe )



## Kartoffelbrei (12. Mai 2014)

Guten Abend,

ich habe mal wieder ein Problem beim lösen einer Aufgabe für die Hochschule ( Java Programmieren 2 ). Entwicklungsumgebung ist BlueJ.

Das Thema unter welchem diese Aufgabe steht ist der Vererbung. Das Ziel ist einen See mit Schiffen zu füllen und die Motorschiff mit Ladung beladen zu können.

Es gibt 3 Hierarchie Ebenen. Ganz oben steht die Klasse Schiff, darunter die Klasse Motorschiff und darunter Containerschiff, zusätzlich gibt es noch die Klassen Ladung und See. In der Klasse Ladung, können Objekte erstellt werden, welche dann in eine ArrayList in der Klasse Motorschiff gespeichert werden. Man die kann Containerschiff mittels einer ArrayList in See auf "See" schicken. 

Mein Problem ist, das Objekte der Klasse See, alle Schiffe auf See auffordern sollen, ihre Ladung auszugeben, welche in der ArrayList in der Klasse Motorschiff gespeichert ist. Nun habe ich in Motorschiff eine Methode erstellt, welche auch das auflisten ordnungsgemäß durchführt. Jedoch erhalte ich, wenn ich diese Methode von See Aufrufe die Fehlermeldung "non-static method ladungAuflisten() cannot be referenced from a static context". Das ist ja auch logisch, denn die Methode versucht ja auf etwas zuzugreifen, was es erst gibt wenn es Objekte gibt. Das Schlüsselwort static sollen wir nicht verwenden, damit wäre es schnell gelöst. 


```
public class See
{
    private ArrayList <Schiff> schiffsverkehr;

    /**
     * Konstruktor für Objekte der Klasse See
     */
    public See()
    {
        this.schiffsverkehr=new ArrayList <Schiff>();
    }

    /**
     * Entfernt angegebens Objekt aus der See.
     */
    public void schiffraus(Schiff Schiff)
    {
        schiffsverkehr.remove(Schiff);
    }

    /**
     * Fügt angegebenes Objekt in die See.
     */
    public void schiffrein(Schiff Schiff)
    {
        schiffsverkehr.add(Schiff);
    }

    public  void schiffeauflisten()
    {for (Schiff schiff : schiffsverkehr )
        {schiff.anzeigen();
            System.out.println();
        }
    }

    public void ladungAnzeigen()
    {
        Motorschiff.ladungAuflisten();
    }

}
```


```
public class Schiff
{
    // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
    private String name;
    private String typ;

    /**
     * Konstruktor für Objekte der Klasse Schiff
     */
    public Schiff(String name)
    {
        this.name=name;
        typ="Schiff";
    }

    public void anzeigen()
    {
        System.out.print("Name: "+name);
    }

    public String gibname()
    {
        return name;
    }

    public String gibtyp()
    {
        return typ;
    }

}
```


```
public class Motorschiff extends Schiff
{
    // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
    private String treibstoff;
    private String typ;
    private ArrayList <Ladung> ladungen;

    /**
     * Konstruktor für Objekte der Klasse Motorschiff
     */
    public Motorschiff(String name,String treibstoff)
    {
        // Instanzvariable initialisieren
        super(name);
        this.treibstoff=treibstoff;
        typ="Motorschiff";
        this.ladungen = new ArrayList <Ladung>();
    }

    public void anzeigen()
    {
        super.anzeigen();
        System.out.println("Typ: "+typ+ " Treibstoff: "+treibstoff);
    }

    public String gibtreibstoff()
    {
        return treibstoff;
    }

    /**
     * Fügt angegebenes Objekt in das Motorschiff.
     */
    public void ladungRein(Ladung ladung)
    {
        ladungen.add(ladung);
    }

    /**
     * Entfernt angegebens Objekt aus dem Motorschiff.
     */
    public void ladungRaus(Ladung ladung)
    {
        ladungen.remove(ladung);
    }

    public void ladungAn()
    {
        for (Ladung ladung : ladungen)
        {ladung.anzeigen();
            System.out.println();
        }      
    }

    public void ladungAuflisten()
    {
        for( int i = 0; i < ladungen.size(); i++)
        {
            ladungen.get(i).anzeigen();
        }
    }
    
}
```


```
public class Containerschiff extends Motorschiff
{
    // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
    private int maxgewicht;
    private String typ;

    /**
     * Konstruktor für Objekte der Klasse Containerschiff
     */
    public Containerschiff(String name, String treibstoff,int maxgewicht)
    {
        // Instanzvariable initialisieren
        super(name,treibstoff);
        this.maxgewicht=maxgewicht;
        typ="Containerschiff";

    }

    public void anzeigen()
    {
        System.out.println("Name: "+gibname()+" Typ: "+typ+" Treibstoff: "+gibtreibstoff()+" Maximales Gewicht : "+maxgewicht+"kg");
    }

}
```


```
public class Ladung
{
    // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
    private String ladungsname;
    private double gewicht;

    /**
     * Konstruktor für Objekte der Klasse See
     */
    public Ladung(String ladungsname,double gewicht)
    {
        // Instanzvariable initialisieren
        this.ladungsname= ladungsname;
        this.gewicht=gewicht;
    }

    public void anzeigen()
    {
        System.out.println("Ladungsname: "+ladungsname+" Gewicht: "+gewicht);
    }

}
```

Die Methoden für das hinzufügen und entfernen der Ladung muss in Motorschiff bleiben, da nur Objekte vom Typ Motorschiff dies Fähigkeiten haben dürfen. Es gibt auch noch andere Klasse wie Segelschiff usw. diese sind hier aber unerheblich. 

Jemand eine Idee, wie ich den Aufruf der Methode ladungAuflisten() in Motorschiff von See aus durchführen kann oder einen anderen Ansatz wie ich die Ladung ausgegeben bekomme?

Vielen Dank fürs Lesen und schönen Abend!


----------



## Athena (13. Mai 2014)

```
public void ladungAnzeigen() {
		for (Schiff s : schiffsverkehr) {
			if (s instanceof Motorschiff) {
				((Motorschiff) s).ladungAuflisten();
			}
		}
	}
```

Nicht getestet, aber das müsste so im Groben deine Lösung sein.

Liebe Grüße,


Athena


----------



## Kartoffelbrei (13. Mai 2014)

Vielen Dank Athena!

Es klappt wunderbar!


----------

