t3.equals(t3)
є єдиним рядком, який має правильні аргументи, що відповідають підпису методу, public boolean equals (Test testje)
тому це єдиний рядок у програмі, який насправді викликає цей оператор print. Це питання покликане навчити вас кільком речам.
- Весь клас неявно розширює Object
- Object.java містить метод equals, який приймає тип Object
- може існувати кілька методів з однаковим іменем за умови, що вони мають різні аргументи - це відоме як перевантаження методів
- метод методу перевантаження, чий підпис відповідає аргументам під час виконання - це метод, який отримує виклик.
По суті, фокус у тому, що Test неявно розширює Object, як це роблять усі класи Java. Об'єкт містить рівний метод, який приймає тип Об'єкт. t1 і t2 набираються так, що під час виконання аргументи ніколи не збігаються з сигнатурою методу equals, яка визначена у тесті. Замість цього він завжди викликає метод equals в Object.java, оскільки або базовий тип - це Object, і в цьому випадку єдиними методами, до яких ви маєте доступ, є методи, визначені в Object.java, або похідним типом є Object, і в цьому випадку
public boolean equals(Test testje)
Неможливо ввести, оскільки в цьому випадку під час виконання аргумент має тип Object, який є суперкласом тесту, а не підкласом. Отже, замість цього він розглядає метод equals у неявно набраному суперкласі Object.java Test.java, який також містить метод equals, який просто має підпис методу
public boolean equals (Object o)
які в цьому випадку відповідають нашим аргументам під час виконання, тож цей метод дорівнює саме тому, який виконується.
Зауважте, що t3.equals(t3)
як базовий тип, так і похідний тип t3 є тестом.
Test t3 = new Test ();
це означає, що під час виконання ви викликаєте метод equals у Test.java, а аргумент, який ви передаєте, насправді має тип Test, тому підписи методу збігаються, а код всередині Test.java виконується. На цей момент count == 4
.
Бонусні знання для вас:
@Override
анотація, яку ви, можливо, бачили в кількох місцях, явно вказує компілятору провалитися, якщо він не знаходить десь у суперкласі метод із точно таким самим підписом. Це корисно знати, якщо ви точно маєте намір замінити метод, і ви хочете бути абсолютно впевненим, що ви дійсно перевизначаєте метод, і ви випадково не змінили метод ні в суперкласі, ні в підкласі, але не в обох, і ввели помилку виконання де неправильна реалізація методу називається причиною небажаної поведінки.