Vererbung

Nepos

Mitglied
Hallo alle zusammen!

Ich probiere mich gerade in der Vererbung.
In der Aufgabe müssen Tiere kathegorisiert werden. Die Tiere haben alle die gleichen Eigenschaften.

Eine Nummer
Lieblingsfutter
Das Geräusch das sie machen
ob es ein Haustier ist

Ich wollte das so realisieren, doch dabei mache ich wohl was falsch. Was ist mein (gedanken-)fehler?

Ich hoffe ihr könnt mir helfen/ein paar Tipps geben:

Java:
public class ZooAnimal {
	private List<String> feed = new ArrayList<>();
	private int number;
	private String sound;
	private boolean pet;
	
	public ZooAnimal(int number, List<String> feed, String sound, boolean pet){
		this.number=number;
		this.feed=feed;
		this.sound=sound;
		this.pet=pet;
	}
	
	//Getter & Setter
	
	}
	
public class Feloidea extends ZooAnimal{

	public Feloidea(int number, List<String> feed, String sound, boolean pet) {
		super(number, feed, sound, pet);
		// TODO Auto-generated constructor stub
	}
}

public class Amurtiger extends Feloidea  {
private List<String> amurtiegerFeed = new ArrayList<>();
amurtiegerFeed.add("Fleisch");

	public Amurtiger(int number) {
                //Auch hier kann ich nicht mit der Liste arbeiten

		super(number, amurtiegerFeed, "Brüll", false);
		// TODO Auto-generated constructor stub
	}	
}
 
Zuletzt bearbeitet von einem Moderator:
Java:
amurtiegerFeed.add("Fleisch");
Das muss in eine Methode oder den Konstruktor

P.S. Fehlermeldungen sollte man immer mit angeben.
 
Java:
amurtiegerFeed.add("Fleisch");
Dieser Teil sollte in einer Methode stehen.

Java:
	public Amurtiger(int number) {
                //Auch hier kann ich nicht mit der Liste arbeiten
...
Meinst du hier die Liste die du oben erstellt hast oder der Liste aus der Klasse ZooAnimal?
Wenn du die Liste der Klasse ZooAnimal meinst, liegt das daran das diese als private deklariert worden ist und somit nur in der Klasse ZooAnimal verfügbar ist. Deklariere sie als protected dann sollte sie in den Subklassen ebenfalls verfügbar sein.
 
Vielen Dank!

Wenn ich das so mache:
Java:
public Amurtiger(int number, List<String> feed, String sound, boolean pet) {
		amurtiegerFeed.add("Fleisch");
		super(number, amurtiegerFeed, "Brüll", false);
		// TODO Auto-generated constructor stub
	}

oder (in dem Fall ist es auf protected gesetzt):

Java:
public Amurtiger(int number, List<String> feed, String sound, boolean pet) {
		feed.add("Fleisch");
		super(number, amurtiegerFeed, "Brüll", false);
		// TODO Auto-generated constructor stub
	}

Sagt er mir das nichts vor dem super() stehen darf.

Mit der methode werde ich das gleich ausprobieren...

EDIT:

Lösungsversuch per Methode sieht dann bei mir so aus:
Java:
public class Amurtiger extends Feloidea  {
	private List<String> amurtiegerFeed = new ArrayList<>();     //Fehlermeldung: Syntax error on token ";", , expected
	feedM;
	
	public Amurtiger(int number) {
		super(number, amurtiegerFeed, "Brüll", false);              //Fehlermeldung: Cannot refer to an instance field amurtiegerFeed while explicitly invoking a constructor
		// TODO Auto-generated constructor stub
	}
	
private void feedM(){
	amurtiegerFeed.add("Fleisch");
}

	
}

Nun mehren sich die Probleme. Siehe Kommentare
 
Zuletzt bearbeitet:
Java:
public class Amurtiger extends Feloidea  {
    private List<String> amurtiegerFeed = new ArrayList<>();   // <-- diese liste brauchst du nicht, du hast ja in ZooAnimal schon eine Liste für das/die Lieblingsessen des Tieres 
    feedM;  // Methoden aufrufe können auch nur in Methoden stehen bzw. im Konstruktor. Außerdem fehlen die Klammern feedM();
    
    public Amurtiger(int number) {
        super(number, amurtiegerFeed, "Brüll", false);          // <-- es wird erst der Konstruktor der Super Klasse ausgeführt, und zu diesem Zeitpunkt ist die Liste amutiegerFeed noch nicht erstellt/verfügbar
    }
    
private void feedM(){
    amurtiegerFeed.add("Fleisch");
}
 
    
}


Hier ein möglicher Lösungsvorschlag! Wobei ich den Konstrukter der Klasse ZooAnimal angepasst habe (weiß ja nicht ob erlaubt)
Java:
public class ZooAnimal 
{
    private List<String> feed = new ArrayList<>();
    private int number;
    private String sound;
    private boolean pet;
    
    public ZooAnimal(int number, String sound, boolean pet)
    {
        this.number=number;
        this.sound=sound;
        this.pet=pet;
    }
    
    public void addFeed(String newFeed)
    {
        this.feed.add(newFeed);    
    }
}
    
public class Feloidea extends ZooAnimal
{
    public Feloidea(int number, String sound, boolean pet) 
    {
        super(number, sound, pet);
    }
}
 
public class Amurtiger extends Feloidea
{ 
    public Amurtiger(int number) 
    {
        super(number, "Brüll", false);
        super.addFeed("Fleisch");  // 'super' deshalb, weil es ja die Methode einer Parentclass ist
    }   
}
 
Zuletzt bearbeitet von einem Moderator:
[JAVA=2]
private List<String> amurtiegerFeed = new ArrayList<>(); // <-- diese liste brauchst du nicht, du hast ja in ZooAnimal schon eine Liste für das/die Lieblingsessen des Tieres
[/code]

Da hast Du recht, das war so eine Hilfskonstruktion da ich nicht weiß wie ich das anders, direkt in den Konstruktoraufruf, schreiben kann.

Dein Kritik mit der Methode ist berechtigt. Da ich nichts vor super(...) schreiben darf, bleibt mir nur noch die Möglichkeit es direkt in super(...) zu schreiben. Nur wie?

Was besseres als:
Java:
super(number, new ArrayList<String>("Fleisch"), "Brüll", false);
..ist mir nicht eingefallen und google sagt mir auch nichts gescheites.

Habt ihr einen Hinweis für michß
 
Was besseres als:
Java:
super(number, new ArrayList<String>("Fleisch"), "Brüll", false);
..ist mir nicht eingefallen und google sagt mir auch nichts gescheites.

Habt ihr einen Hinweis für michß

Java:
List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
oder
Java:
new ArrayList<String>(){"Fleisch"} // bin mir gerade nicht sicher ob das so in Java auch geht
Das ganze natürlich entsprechend auf deinen Aufruf im Konstruktor angepasst
 
Das geht leider nicht:
Java:
new ArrayList<String>(){"Fleisch"}

Aber das:
Java:
super(number, Arrays.asList("Fleisch"), "Brüll", false);

Vielen, vielen Dank! 🙂

Ich habe noch eine Frage (ich will es ja begeifen und nicht nur eine Lösung für dieses dämliche Beispiel...):

Java:
public class ZooAnimal {
	protected List<String> feed = new ArrayList<>();
	private int number;
	private String sound;
	private boolean pet;

...



public class Amurtiger extends Feloidea  {
	
	public Amurtiger(int number) {
		super(number, Arrays.asList("Fleisch"), "Brüll", false);
		feed.add("Fleisch2");
	}	
}

wenn ich feed.add("Fleisch2"); dazuschreibe gibt mir Eclipse beim Kompelieren ein Fehler aus (vorher jedoch nicht). Was läuft da schief?
 
Java:
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(Unknown Source)
	at java.util.AbstractList.add(Unknown Source)
	at main.Amurtiger.<init>(Amurtiger.java:9)
	at main.Main.main(Main.java:15)
(Amurtiger.java:9):
[JAVA=9]
feed.add("Fleisch2");
[/code]
(Main.java:15):
[JAVA=9]
public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
List<ZooAnimal> animals = new ArrayList<>();

animals.add(new Amurtiger(1)); //<--HIER

for (ZooAnimal tmpAnimal : animals){
System.out.println(tmpAnimal.toSting());
}
}
[/code]
 
Poste doch mal den ganzen Code..da fehlt doch die Hälfte?!

Das Problem ist wohl, dass du sowas tust:

Code:
Arrays.asList("a").add("b");

Arrays.asList liefert eine Liste zurück welche in ihrer Größe nicht verändert werden darf...d.h. set() ist erlaubt, add/remove jedoch nicht.

Und lies dir nochmal die Beiträge von den anderen durch, da steht eigentlich die Lösung drinnen..


Edit: Eine einzelne Zeile Code zu posten aus der Klasse die den Fehler wirft ist nicht hilfreich. Das Problem liegt im Konstruktor der Klasse..wie oben beschrieben..versuch etwas zu Arrays.asList hinzuzufügen...
 
Hier der gesamte Quelltext:

Java:
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<ZooAnimal> animals = new ArrayList<>();
		
		animals.add(new Amurtiger(1));
		
		for (ZooAnimal tmpAnimal : animals){
			System.out.println(tmpAnimal.toSting());
		}
	}

Java:
public class ZooAnimal {
	protected List<String> feed = new ArrayList<>();
	private int number;
	private String sound;
	private boolean pet;
	
	public ZooAnimal(int number, List<String> feed, String sound, boolean pet){
		this.number=number;
		this.feed=feed;
		this.sound=sound;
		this.pet=pet;
	}
	
	public List<String> getFeed() {
		return feed;
	}
	public void setFeed(List<String> feed) {
		this.feed = feed;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getSound() {
		return sound;
	}
	public void setSound(String sound) {
		this.sound = sound;
	}
	public boolean isPet() {
		return pet;
	}
	public void setPet(boolean pet) {
		this.pet = pet;
	}
	
	public String toSting(){
		String result= "#" + number;
		result += "\n\t ";
		for (String s : feed){
			result += s + ", ";
		}
		result += "\n\t ... macht: " + sound;
		result += "\n\t ...ist ein Haustier: " + pet;
		
		return result;
		
	}
}

Java:
import java.util.Arrays;

public class Amurtiger extends Feloidea  {
	
	public Amurtiger(int number) {
		super(number, Arrays.asList("Fleisch"), "Brüll", false);
	}	
}

Java:
public class Feloidea extends ZooAnimal{

	public Feloidea(int number, List<String> feed, String sound, boolean pet) {
		super(number, feed, sound, pet);
		// TODO Auto-generated constructor stub
	}
}

Ich dachte das Array.asList() wird an eine ArrayListe übegeben (in ZooAnimal) und somit den Charakter von einer Arraylist und nicht von einem Array hat.
Bisher hat das nur mit dem Array.asList() geklappt (alle anderen idden habe ich nicht zum laufen bekommen) -- das Programm läuft.

mich würde es dennoch interessieren 🙂.
 
Folgendes Problem:

Du rufst den Konstruktor von ZooAnimal auf mit

Java:
super(..., Arrays.asList(..));

Im Konstruktor dann:

Java:
public ZooAnimal(..List<String> feed..){
   this.feed = feed;
}

Dadurch wird die Liste von Arrays.asList als Instanzvariable "gespeichert". Nun versuchst du, zu dieser Liste etwas hinzuzufügen, was aber nicht funktioniert, weil Arrays.asList eine Liste mit fester Größe zurückliefert.

Eine Lösung wäre z.B.

Java:
class ZooAnimal{
   ...
 
   public ZooAnimal(int number, String sound, boolean pet){
        this.number=number;
        this.feed=new ArrayList<String>();
        this.sound=sound;
        this.pet=pet;
   }
   public void addFeed(String f) { feed.add(f); }
}

class Amurtiger {
..
   public Amurtiger(int number) {
        super(number, "Brüll", false);
        addFeed("Fleisch");
    } 
..
}
 

Zurück
Oben