Так в спецификации установлено.
Если операнд оператора + (-, *,/... в общем там, где должно быть число) является объектом, то автоматически вызывается метод valueOf этого объекта (если он есть), который должен вернуть число.
Тоже самое, когда нужно из объекта получить строку, автоматически вызывается метод toString, который должен вернуть строку
|