public class Imp1 implements Inter1 {
private int num;
@Override
public void apply() {
num++;
}
public void doubler() {
num = num * 2;
}
public boolean equals(Imp1 o) {
if (!(o instanceof Imp1))
return false;
return o.num == num;
}
public int getNum() {
return num;
}
public static void main(String[] args) {
final Inter1 a = new Imp1();
final Imp1 b = new Imp1();
a.apply();
b.apply();
System.out.println("a equals b " + a.equals(b));
System.out.println("b equals a " + b.equals(a));
}
}
Ich würde erwarten, equals(Imp1 o)
für a.equals(b)
und b.equals(a)
als den besten Kandidaten gewählt werden, warum ist es hier nicht der Fall?Warum Überlastung mit param des Unterklassentypen wird über einige Elternklassen nicht gewaehlt
In mehr Details - dieser Code gibt zweimal falsch aus und ich frage mich warum? a und b hält Imp1-Objekt, daher Aufruf gleich mit Imp1-Instanz als param sollte equals(Imp1 o)
aufrufen, die besser als equals(Object o)
passt, aber ich sehe, dass equals(Object o)
aufgerufen wird, und schließlich der Code zweimal falsch statt zweimal true.
und was a.equals (b) ?, es auch falsch druckt !! –
@OfekRon bearbeitet Antwort – Eran
aber Java überschreiben ist virtuell in C++ - Jargon, dies bedeutet, dass die tatsächliche Methode aufgerufen werden muss, ist der der Instanzklasse nicht der Referenztyp Klasse –