Java dynamische Bindung und Methode überschreiben

Gestern hatte ich ein zweistündiges technisches Telefoninterview (das ich bestanden habe, woohoo!), Aber ich habe die folgende Frage in Bezug auf dynamisches Binden in Java vollständig geklärt. Und es ist doppelt rätselhaft, weil ich vor ein paar Jahren als TA Studenten dieses Konzept beigebracht habe. Die Aussicht, dass ich ihnen Fehlinformationen gegeben habe, ist also ein wenig beunruhigend ...

Hier ist das Problem, das mir gegeben wurde:

/* What is the output of the following program? */

public class Test {

  public boolean equals( Test other ) {
    System.out.println( "Inside of Test.equals" );
    return false;
  }

  public static void main( String [] args ) {
    Object t1 = new Test();
    Object t2 = new Test();
    Test t3 = new Test();
    Object o1 = new Object();

    int count = 0;
    System.out.println( count++ );// prints 0
    t1.equals( t2 ) ;
    System.out.println( count++ );// prints 1
    t1.equals( t3 );
    System.out.println( count++ );// prints 2
    t3.equals( o1 );
    System.out.println( count++ );// prints 3
    t3.equals(t3);
    System.out.println( count++ );// prints 4
    t3.equals(t2);
  }
}

Ich habe behauptet, dass die Ausgabe zwei separate print-Anweisungen innerhalb des überschriebenen @ sein solltequals() method: att1.equals(t3) undt3.equals(t3). Der letztere Fall ist offensichtlich genug, und mit dem ersteren Fall, obwohlt1 hat eine Referenz vom Typ Object und wird als Typ Test instanziiert. Daher sollte die dynamische Bindung die überschriebene Form der Methode aufrufen.

Scheinbar nicht. Mein Interviewer ermutigte mich, das Programm selbst auszuführen, und siehe da, es gab nur eine einzige Ausgabe der überschriebenen Methode: at the linet3.equals(t3).

Meine Frage ist dann, warum? Wie ich schon erwähnte, obwohlt1 ist eine Referenz vom Typ Object (statische Bindung würde also Object's @ aufrufenequals() Methode), dynamisches Bindensollt Achten Sie darauf, die spezifischste Version der Methode basierend auf dem instanziierten Typ der Referenz aufzurufen. Was vermisse ich

Antworten auf die Frage(26)

Ihre Antwort auf die Frage