Polymorphie

Neue Frage »

Auf diesen Beitrag antworten »
gg_ Polymorphie

Meine Frage:
Guten morgen,
ich habe ein Java-Code, die ich aber leider nicht so ganz verstehe.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
public class Drehung {

    public void dreheLinks() {
        System.out.println("Drehung:dreheLinks");
    }

    public void dreheRechts() {
        System.out.println("Drehung:dreheRechts");
        dreheLinks();
        dreheLinks();
        dreheLinks();

    }

    public void schrittVor() {
        System.out.println("Drehung:schrittVor");

    }

   
   
}

public abstract class Figur extends Drehung{
   
    public abstract void tanze();

   
      void losGehts() {
        System.out.println("Figur:losGehts");
        schrittVor();

    }

    public void dreheRechts() {
        System.out.println("Figur:dreheRechts");
        losGehts();
        super.dreheRechts();

    }
   

}

public class KleineFigur extends Figur {

    void losGehts() {
        System.out.println("KleineFigur:losGehts");
        schrittVor();
    }

    public void schrittVor() {
        System.out.println("KleineFIgur:schrittVor");
        super.schrittVor();
    }

    public void tanze() {
        System.out.println("KleineFigur:tanze");
        dreheRechts();
   

    }

}


Was ich nicht verstehe ist, warum in der 3. Zeile die Methode aus der Klasse Kleinefigur aufgerufen wird? Kann mir das jmd. erklären? Hängt es daran das bei der Methode losgehts() der Zugriffsmodifier fehlt?


Meine Ideen:
Die Ausgabe lautet:
KleineFigur:tanze
Figur:dreheRechts
KleineFigur:losGehts
KleineFIgur:schrittVor
Drehung:schrittVor
Drehung:dreheRechts
Drehung:dreheLinks
Drehung:dreheLinks
Drehung:dreheLinks
 
Auf diesen Beitrag antworten »
eulerscheZahl

Es wäre hilfreich den Code zu sehen, der für die Ausgabe verantwortlich ist.
Auf diesen Beitrag antworten »
gg_

code:
1:
(new KleineFigur()).tanze();
Auf diesen Beitrag antworten »
eulerscheZahl

Du hast ein Objekt vom Typ KleineFigur.
Wenn es da eine Methode losGehts gibt, wird sie auch verwendet.
 
Auf diesen Beitrag antworten »
gg_

Ich verstehe es wirklich nicht so ganz, es wird zuerst die Methode dreheRechts() aus der Klasse Figur aufgerufen, warum wir denn dort (in der Klasse Figur) nicht die Methode losGehts() aufgerufen?
Auf diesen Beitrag antworten »
eulerscheZahl

Weil du immer noch ein Objekt der Klasse KleineFigur als aufrufende Klasse hast.
Stelle dir das am besten so vor: wenn du die Methode nicht überschreibst, wird sie einfach aus der Basisklasse genommen und hineinkopiert.

Ändern wir die Methode Figur.dreheRechts etwas ab:
code:
1:
2:
3:
4:
5:
public void dreheRechts() {
	System.out.println("Figur:dreheRechts -> " + getClass().getName());
	losGehts();
	super.dreheRechts();
}

mit getClass().getName() kriegst du den Namen der aufrufenden Klasse
Ausgabe: "Figur:dreheRechts -> KleineFigur"
Auf diesen Beitrag antworten »
gg_

achh jetzt verstehe ich es DANKE
Auf diesen Beitrag antworten »
gg_

mir ist etwas noch unklar:
in der Klasse KleineFigur ist ein Methodenaufruf mit super. Wird dann die Methode aus der Figur aufgerufen oder aus der Klasse Drehung, die Drehung ist ja die Oberklasse von allen
Auf diesen Beitrag antworten »
as_string

super bezieht sich immer auf dem direkten Vater. Sonst wäre es in Java ja immer Object.
Außerdem sollst Du ja gar nicht zwingend wissen müssen, von welcher Klasse eine andere Klasse erbt, die Du erweitern willst. Deshalb immer nur eine drüber, die Du auch gerade erweiterst.

Gruß
Marco
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »