Hallo,
bin grade beim probieren auf folgendes gestoßen was mir nicht ganz einleuchtet. Dazu folgender code:
die Ausgabe des Programm sollte nach meinem Wissen 1 4 1 2 2 4 sein. Ist Sie aber nicht sondern 1 3 1 2 2 3. Nun bin ich aber der Meinung das die Methode public void m(Vogel v, Fisch f) spezieller ist als public void m(Tier t1, Fisch t2). Also änderte ich den Namen der Methode in Sub auf "test" und den Aufruf auf "sup2.test(v1, f);" wenn ich nun compeliere bekomme ich folgenden Fehler:
TierTest.java:40: cannot find symbol
symbol : method test(Vogel,Fisch)
location: class Super
sup2.test(v1, f); // Aufruf #6
^
1 error
Nun hab ich gesehen das sup2 vom Typ Super ist und die Methode test in Super ja nicht existiert. Wenn aber bei der Ausführung des eigentlich Programms sowieso nur die Methoden in der Klasse Super für die Ausführung in Frage kommen warum gibt es dann in der Ausgabe die "3" die ja nur in einer Methode in der Klasse Sub ausgegeben wird.
Ich glaube ich hab das noch nicht ganz verstanden wann bei dieser Zuweisung "Super sup2 = new Sub();" für die Auflösung wichtig ist der Typ von dem sup2 ist oder welches Objekt dem zugeordnet wird.
Wäre für eine kurze Erläuterung dankebar
Gruß
bin grade beim probieren auf folgendes gestoßen was mir nicht ganz einleuchtet. Dazu folgender code:
Code:
class Tier {}
class Fisch extends Tier {}
class Vogel extends Tier {}
class Huhn extends Vogel {}
class Spatz extends Vogel {}
class Karpfen extends Fisch {}
class Super {
public void m(Tier t1, Tier t2)
{ System.out.println("1"); }
public void m(Tier t, Fisch f)
{ System.out.println("2"); }
public void m(Fisch f, Tier t)
{ System.out.println("5"); }
}
class Sub extends Super {
public void m(Vogel v, Fisch f)
{ System.out.println("4"); }
public void m(Tier t1, Fisch t2)
{ System.out.println("3"); }
}
public class TierTest {
public static void main(String[] args) {
Tier t1 = new Tier();
Tier t2 = new Vogel();
Fisch f = new Karpfen();
Vogel v1 = new Vogel();
Vogel v2 = new Spatz();
Huhn h = new Huhn();
Karpfen k = new Karpfen();
Super sup1 = new Super();
Super sup2 = new Sub();
sup1.m(h, v2); // Aufruf #1
sup2.m(v1, f); // Aufruf #2
sup1.m(t1, t2); // Aufruf #3
sup1.m(v1, k); // Aufruf #4
sup1.m(v2, f); // Aufruf #5
sup2.m(v1, f); // Aufruf #6
}
}
die Ausgabe des Programm sollte nach meinem Wissen 1 4 1 2 2 4 sein. Ist Sie aber nicht sondern 1 3 1 2 2 3. Nun bin ich aber der Meinung das die Methode public void m(Vogel v, Fisch f) spezieller ist als public void m(Tier t1, Fisch t2). Also änderte ich den Namen der Methode in Sub auf "test" und den Aufruf auf "sup2.test(v1, f);" wenn ich nun compeliere bekomme ich folgenden Fehler:
TierTest.java:40: cannot find symbol
symbol : method test(Vogel,Fisch)
location: class Super
sup2.test(v1, f); // Aufruf #6
^
1 error
Nun hab ich gesehen das sup2 vom Typ Super ist und die Methode test in Super ja nicht existiert. Wenn aber bei der Ausführung des eigentlich Programms sowieso nur die Methoden in der Klasse Super für die Ausführung in Frage kommen warum gibt es dann in der Ausgabe die "3" die ja nur in einer Methode in der Klasse Sub ausgegeben wird.
Ich glaube ich hab das noch nicht ganz verstanden wann bei dieser Zuweisung "Super sup2 = new Sub();" für die Auflösung wichtig ist der Typ von dem sup2 ist oder welches Objekt dem zugeordnet wird.
Wäre für eine kurze Erläuterung dankebar
Gruß