+
не является примером перегрузки оператора. +
встроен в язык как оператор конкатенации и оператор арифметического сложения.
Это означает, что человек, пишущий программу на Java, не может перегружать операторы, но в отношении грамматики языка Java +
определяется как оператор объединения и сложения.
EDIT
Работает для других классов, таких как Integer
и Double
из-за autoboxing .
Если вы посмотрите на байт-код программы Java, которая выполняет конкатенацию строк, вы увидите, что она создает StringBuilder
и использует метод append()
. Компилятор Java видит оператор +
и понимает, что операнды являются строками, а не примитивными типами (например, int
).
Если вы посмотрите на байт-код программы, которая выполняет сложение целых чисел, вы увидите, что она использует инструкцию iadd
для выполнения сложения целых чисел. Это потому, что компилятор понимает, что операнды операции +
являются целыми числами.
Если сделать что-то вроде Integer i = 4
, то байт-код покажет, что вы на самом деле делаете Integer i = Integer.valueOf(4)
. Это называется автобоксом. Позже, когда вы сделаете что-то вроде i + p
, где оба i
и p
имеют тип Integer
, сгенерированный байт-код покажет, что вы делаете i.intValue() + p.intValue()
, где возвращаемые типы обоих методов int
(действительная инструкция для байт-кода снова равна iadd
).
Вот почему +
работает Integer
, хотя они не являются настоящими примитивными типами.