t3.equals(t3)
ist die einzige Zeile mit den richtigen Argumenten, die mit der Methodensignatur übereinstimmen. public boolean equals (Test testje)
Es ist also die einzige Zeile im Programm, die diese print-Anweisung tatsächlich aufruft. Diese Frage soll Ihnen einige Dinge beibringen.
- Alle Klassen erweitern implizit Object
- Object.java enthält eine Methode equals, die den Typ Object annimmt
- Es können mehrere Methoden mit demselben Namen vorhanden sein, sofern sie unterschiedliche Argumente haben. Dies wird als Methodenüberladung bezeichnet
- Die Methodenmethodenüberladung, deren Signatur zur Laufzeit mit den Argumenten übereinstimmt, ist die Methode, die aufgerufen wird.
Der Trick dabei ist im Wesentlichen, dass Test Object implizit erweitert, wie es alle Java-Klassen tun. Object enthält eine equals-Methode vom Typ Object. t1 und t2 werden so typisiert, dass die Argumente zur Laufzeit niemals mit der in Test definierten Methodensignatur von equals übereinstimmen. Stattdessen wird immer die Methode equals in Object.java aufgerufen, da entweder der Basistyp Is Object ist. In diesem Fall haben Sie nur Zugriff auf die in Object.java definierten Methoden, oder der abgeleitete Typ ist Object. In diesem Fall
public boolean equals(Test testje)
Kann nicht eingegeben werden, da in diesem Fall das Argument zur Laufzeit vom Typ Object ist, bei dem es sich um eine Superklasse des Tests und nicht um eine Unterklasse handelt. Stattdessen wird die Methode equals in der implizit typisierten Superklasse Object.java von Test.java betrachtet, die auch eine Methode equals enthält, die zufällig eine Methodensignatur von hat
public boolean equals (Object o)
die in diesem Fall mit unseren Argumenten zur Laufzeit übereinstimmen, sodass diese Methode gleich ist, die ausgeführt wird.
Beachten Sie, dass t3.equals(t3)
sowohl der Basistyp als auch der abgeleitete Typ von t3 Test sind.
Test t3 = new Test ();
Dies bedeutet, dass Sie zur Laufzeit die Methode equals in Test.java aufrufen und das Argument, das Sie übergeben, tatsächlich vom Typ Test ist, sodass die Methodensignaturen übereinstimmen und der Code in Test.java ausgeführt wird. An diesem Punkt count == 4
.
Bonuswissen für Sie:
@Override
Anmerkungen, die Sie möglicherweise an einigen Stellen gesehen haben, weisen den Compiler explizit an, fehlzuschlagen, wenn er irgendwo in einer Superklasse keine Methode mit genau derselben Signatur findet. Dies ist hilfreich, um zu wissen, ob Sie definitiv beabsichtigen , eine Methode zu überschreiben, und ob Sie absolut sicher sein möchten, dass Sie die Methode wirklich überschreiben und die Methode weder in der Oberklasse noch in der Unterklasse versehentlich geändert haben, jedoch nicht in beiden, und einen Laufzeitfehler eingeführt haben wobei die falsche Implementierung der Methode aufgerufen wird und unerwünschtes Verhalten verursacht.