Bin gerade am Tüfteln von einer wahrscheinlich für euch alle sehr einfachen Aufgabe:
Gegeben sind die folgenden beiden Klassen:
public class A {
public void f() { System.out.println(„method f of class A“); }
public void g() { System.out.println(„method g of class A“); }
}
public class B extends A {
public void g() { System.out.println(„method g of class B“); }
public void h() { System.out.println(„method h of class B“); }
}
Sowie die folgenden Variablendeklerationen:
A a = new A();
B b = new B();
A c = new B();
Welche der folgenden Methodenaufrufe sind korrekt und welche Ausgaben erzeugen sie?
a.g(); // Aufruf 1
a.h(); // Aufruf 2
b.f(); // Aufruf 3
b.g(); // Aufruf 4
c.g(); // Aufruf 5
c.h(); // Aufruf 6
Die Lösung lautet:
a.g(); method g of class A
a.h(); -> geht nicht !!! Keine Methode h() in A
b.f(); method f of class A
b.g(); method g of class B
c.g(); method g of class B
c.h(); -> geht nicht!!!! Allgemeinerer Typ wird verwendet => keine Methode h() in A
Ich verstehe nicht, warum die Methoden b.g(); und c.g(); "method g of class B" und nicht "method g of class A" liefern. Kann mir da einer helfen?
Du hast selbst deine Frage beantwortet... Sobald ich weiß würde der Compiler an der Stelle, an dem die Methode g() deklariert wird, auch eine Info liefern, das du gerade eine Methode überschreibst.
Hey..
Mich würde die Lösung der Aufgabe bzgl Polymorphismus auch interessieren, habe aber das mit der "Überschreibung" nicht so ganz mitbekommen.. kann mir da jemand auf die Sprünge helfen???
LG
Tutorials zu Polymorphismus gibt es bei Goohle zuhauf.
Das mit der Überschreibung geht so: Klasse A hat eine Methode g() und eine Methode x(). Klasse B hat eine Methode g() und eine Methode c() und erweitert A.
Wenn zwei Methoden mit demselben Namen in einem Vererbungskonstrukt auftauchen, so wird die aufgerufen, die am nächsten an der aufrufenden Klasse dran ist. Dabei ist es egal, was diese Methoden tun. Meistens ist aber noch ein super.ding(kram); mit drin. Dieses ruft die nächsthöhere Methode ding auf und übergibt kram.