Java Frage zu Klassen/OOP?

...komplette Frage anzeigen

4 Antworten

Polymorphie ist eine super Sache.

Die Verwendung von Vererbung kann durchaus hilfreich sein.

Beispielsweise sind schon grundlegende Eigenschaften und Methoden in der Klasse "Tier" enthalten. 

Wenn du nun eine Klasse Katze hast, die von Tier erbt, musst du diese Eigenschaften nicht doppelt auch für die Katze neu bereitstellen. Zudem kannst du andere Eigenschaften ändern, und z.B. Katzen-spezifische Methoden hinzufügen.

Aber was die Polymorphie betrifft, merkst du erst, wenn du jene Objekte mit anderen Klassen verwendest.

Sagen wir mal: Du hast eine Klasse Tierkäfig. Diese soll ja nicht nur für ein spezielles Tier gelten, sondern für mehrere.

Entsprechend hat deine Methode: Tierkäfig eine Methode add() welche nicht Katze oder Hund als Parameter nimmt, sondern Tier.:

public boolean add(Tier tier) {
  if (tier.getGroesse() < 50) {
      // Füge hinzu
        return true;
   } else {
        return false;
   }
}


Ein anderes Beispiel: 

Du verwendest für das Füttern einer Schlange ein kleines Nagetier.

class Nagetier extends Tier {}

Jetzt hast du deine Schlange, die gerne Ratten oder Mäuse verspeist.  Entsprechend verwendest du dann nicht nur eine Ratte oder eine Maus, sondern etwas, was beides abdeckt:

public void fressen(Nagetier nagetier);

Beim Anwenden kannst du dann natürlich genauer spezifizieren, wie das aussehen soll:

Schlange schlangeHorst = new Schlange();
schlangeHorst.fressen(new Ratte());


Lakritzstange 18.01.2017, 17:26

Endlich, nach so langer Zeit(kaum zu glauben) habe ich Polymorphie verstanden.
Danke

1
KnusperPudding 18.01.2017, 20:23
@Lakritzstange

Super. Freut mich =)

Achso, dein direktes Beispiel kommt in der Realität natürlich auch öfter vor, jedoch dient der Bequemlichkeit:

List<String> myList;
boolean einBeliebigerGrundIstWahr =...;

if (einBeliebigerGrundIstWahr) {
   myList = new LinkedList<>();
} else {
   myList = new ArrayList<>();
}

Du möchtest eine Implementation von List haben, für den Rest deines Codes ist dir allerdings egal was für eine Liste es ist:

LinkedList, ArrayList oder gar eine andere, dann gib die Niedrigste Spezifikation an, z.B.: List.

So kannst du später bei belieben einfach den Typ deiner List austauschen, oder gar komplett dynamisch gestalten.

0

Du musst die neue Klasse definieren.

public class Katze extends Tier

Danach kannst du dann die Katze auch als Variable deklarieren

public Katze cat = new Katze();

p.s. Bin mit der Syntax grade unsicher, weil die in vielen Sprachen immer anders ist. Aber eigentlich müsste das so hin hauen.

Du kannst natürlich auch

Tier cat = new Katze();

schreiben. Das mit der Polymorphie ist noch relativ uninteressant, wenn du nur ein Tier hast.

Wenn du aber beispielsweise nen Tiger mit rein bringst

class Tiger extends Tier

Dann kannst du mit der Variable cat arbeiten und die Katze auch schnell mal in nen Tiger konvertieren und dessen Eigenschaften verwenden

((Tiger)cat).eat()

Die Katze ist damit auch schnell mal wandlungsfähig, was nicht ginge, wenn du die starr als Katze definiert hast.

Du kannst die Katze in ein Array von Tieren packen, z.B.

es geht um eine objekthierachie.
wenn du eine allgemeinere oberklasse hast, und dort schon sachen definierst, musst du es in der erbenden klasse nicht neu definieren!!

z.b. auto -> hat 4 räder; hat ein lenkrad

smart erbt von auto und daher ist schon definiert, was in auto steht und du musst z.b. nur noch ergänzen "hat 2 türen". 4räder und ein lenkrad hat es schon, da es von auto geerbt hat.

du machst also eine allgemeine "oberklasse" und erbst in den spezielleren klassen von der oberklasse. jetzt musst du in der erbenden klasse NUR die spezifischen sachen die neu/anders sind definieren und nicht nochmal alles.

hoffe das ist verständlich :D


das ganze macht natürlich haupsächlich sinn, wenn du mehrere klassen schreiben musst, die mehrere gleiche eigenschaften haben. dann schreibst du nämlich eine oberklasse und alle erben von dieser, sodass du das was für alle gleich ist nicht in jeder klasse nochmal definieren musst.

Was möchtest Du wissen?