Dynamisches Binden

Status
Nicht offen für weitere Antworten.

Mariem

Mitglied
hallo aller seits,

Ich habe ein paar Anfänger Fragen : ) Ich hoffe das ihr mir weiter helfen könnt:

Also ich habe zwei Klassen Student und Person, Student erbt von Person. In die beiden klassen befindet sich die gleiche Methode jedoch die Eingabeparameter sind nicht gleich. Und ich habe einer Klasse Book die von Document erbt! so:

Klasse Person:
Java:
    /**
     * Covariant in the argument.
     */
    public Document goCrazy2(Document document) {
        System.out.println("[Person] Covariant in the argument: " +
                document.toString());
        return (new Document("Whatever"));
    }

Klasse Student:

Java:
    /**
     * Covariant in the argument.
     */
    public Document goCrazy2(Book book) {
        System.out.println("[Student] Covariant in the argument: " +
                book.toString());
        book.setPages(100);
        System.out.println("          The number of pages of the book: " +
                book.getPages());
        return (new Document("Whatever"));
    }

jetzt kommt meiner Frage:
Ich habe 2 Statements:

Document d3 = p.goCrazy2(aBook);

und

d3 = ((Student)p).goCrazy2(aBook)

Ich verstehe nicht warum in der erste Zeile die Methode aus der Klasse Person aufgerufen wird und in der 2 Zeile die Methode aus der Klasse Student? wird hier dynamisch gebunden??
 
erst wird vom Compiler gebunden, dann dynamisch der Rest,

bei
> d3 = ((Student)p).goCrazy2(aBook)
sucht der Compiler die Methode mit dem Book-Parameter raus,
kann immer noch von einer weiteren SubKlasse überschrieben werden, aber goCrazy2(Document) ist raus

im anderen Fall andersrum und goCrazy2(Book) überschreibt nicht goCrazy2(Document)
 
Danke SlaterB für deiner schnelle Antwort, Ich habe nicht genau verstanden was du mit "goCrazy2(Document) ist raus" meinst?? bedeutet es dass es zuerst bearbeitet wird?
Was mich wundert ist dass die Methode goCrasy2() in der Klasse Person ein Dokument als eingabe erwartet und trodzdem wird es bearbeitet und der Compiler mekert nicht?
 
Zuletzt bearbeitet:
> nicht genau verstanden was du mit "goCrazy2(Document) ist raus" meinst?? bedeutet es dass es zuerst bearbeitet wird?

goCrazy2(Book) passt am besten, also wird das vom Compiler ausgewählt und vermerkt
"wenn du im Programm hier vorbeikommst, dann suche die Methode goCrazy2 mit Parameter Book"
daher ist die Methode goCrazy2(Document) für diesen Aufruf nicht mehr relevant, kann unmöglich aufgerufen werden

> und trodzdem wird es bearbeitet und der Compiler mekert nicht?

goCrazy2(Document) akzeptiert als Parameter auch Book, da Book von Document erbt,
ohne eine solche Möglichkeit wäre Vererbung recht nutzlos
 
Ok, danke, also ich kann daraus interpretieren dasJava bei Eingabewerte nur das kontravarianz unterstützt und nicht das Kovarianz stimmt das ?? und wenn ja warum unterstützt es nicht bei Eingabewerte das Kovarianz?
 
ach du Schande, was sind denn das für Begriffe?

wichtig ist die Typsicherheit, zur Compilier-Zeit muss klar sein, ob die aufgerufene Methode vorhanden ist,
und wenn man an der Code-Situation ablesen kann, dass goCrazy2(Document) gemeint ist (da es goCrazy2(Book) aus Compiler-Sicht nicht gibt),
dann wäre es doch ein Unding, wenn dann zur Laufzeit eine andere, nicht überschreibene Methode gerufen wird,
damit ließen sich ja finale Methoden aushebeln
 
Danke SlaterB😳, aber was mache ich wenn unsere Lehrerin sich mit solsche blöden Begriffe beschäfftigt 😀 da muss ich einfach durch 😉
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Zurück
Oben