См here:
Возвращает true
, если этот вектор содержит заданный элемент. Более формально возвращает true
тогда и только тогда, когда этот вектор содержит хотя бы один элемент e
такой, что (o==null ? e==null : o.equals(e))
.
.equals
, который в конечном итоге называется переопределенным .equals
. Тот факт, что параметр метода вводится с номером Object
, не означает, что вектор будет использовать метод .equals
класса Object
; он будет использовать переопределенный метод .equals
, если он существует (в противном случае используется один, унаследованный от Object
). Набираемый параметр Object
означает, что вы можете передать все, что есть Object
(что String
есть, так как все классы Java наследуют от Object
).
Вашей путаница проистекает из того факта, что метод вызывается при выполнении зависят от фактического типа объекта, метод которого в настоящее время вызывается. Посмотрите раздел JLS на runtime evalution of method invocations для более подробной информации. Вы можете видеть, что в нем упоминается «целевая ссылка», которая является объектом, метод которого вы вызываете.
Рассмотрим, что произойдет иначе: поведение будет меняться в зависимости от типа параметра метода, а не типа экземпляра. Это полностью победит полиморфизм! Рассмотрим часто используемый пример Animal
: допустим, существует один метод, называемый makeNoise()
, который возвращает строку "Noise!"
. Теперь у вас есть два подкласса Dog
и Cat
, которые переопределили метод для возврата "Woof!"
и "Meow!"
соответственно. Давайте теперь у вас есть этот метод:
public void animalNoiseMaker(Animal animal) {
System.out.println(animal.makeNoise());
}
Идущий на ваши ожидания, независимо от того, прошли ли вы в случае Dog
или Cat
, было бы назвать makeNoise
на Animal
каждый раз, и печать Noise!
, так как тип параметра Animal
. Это не очень полезное поведение.
«под поверхностью» 'a == b' на самом деле истинно, потому что они являются одинаковыми строковыми литералами –