In computer programming, operator overloading (less commonly known as operator ad-hoc polymorphism) is a specific case of polymorphism in which some or all of operators like +, =, or == have different implementations depending on the types of their arguments.
It's generally thought that Java does not support operator overloading which is not true.
Take a look at + operator.
int two = 2;
int six = 6;
int sum = two + six;
System.out.println(sum); // output is 8
Quite expected right? I give two operands (two and six) and + operator adds them together. What if I use strings as operands?
String a = "avenged";
String b = "sevenfold";
String result = a + b;
System.out.println(result); // output: avengedsevenfold
+ operator concatenates two strings. As you can easily see + operator has different implementations depending on the type of operands.
Now, lets take a look at some gotchas of the + operator.
What if I mix different types of operands?
int two = 2;
int six = 6;
String str = "depechemode";
System.out.println(two + six + str);
System.out.println(two + str + six);
System.out.println(str + two + six);
The outputs are quite interesting. Let me explain you how it's processed. From left to right it's inspected if there are any strings as operands. As long as I don't see a string I treat + as addition but when I see one I begin to treat every subsequent operand as strings and I concatenate them.
So I have two + six which are two integers. I add them together which makes 8. Then I see a string and treat 8 as a string and concatenate it with str which in result gives "8depechemode".
Later I have two + str. str is a String so two will be treated like one. As I saw a string I treat all of the rest as strings and concat them. The result is "2depechemode6".
For the last example, we see a string as the first operand. We will begin treating every operand as strings and concat them so I'll have "depechemode26" as result.
I hope that everything is clear for + operator and its overloading capabilities.