Вы сначала вызываете overloadedMethod(int i)
, передавая аргумент 300. Это печатает:
int 300
Затем i *= i
умножает i
на i
и сохраняет результат, 90 000, обратно в i
. Затем вы снова вызываете тот же метод с этим аргументом. Это известно как рекурсия. Таким образом, новый вызов метода печатает:
int 90000
В следующий раз, когда вы снова придете в себя. В результате вы могли ожидать 8 100 000 000, но int
не может содержать это значение. Это переполняет. К сожалению, вы не получите сообщения об этом в Java. Вместо этого
int -489934592
Следующие несколько умножений тоже переполняются, но результат после переполнения оказывается равным 0:
int 0
С этого момента умножение больше не переполняется, оно просто дает 0 каждый раз.
И вы никогда не выйдете из рекурсии. Это продолжается до тех пор, пока ваш стек вызовов не переполнится. Это известно как бесконечная рекурсия.
Вы ожидали, что Java увидит, что 8 100 000 000 не является int
, а затем вызовет перегруженный метод с аргументом float
или double
? Как видите, этого не происходит. Java решает во время компиляции , какой перегруженный метод вызывать. Таким образом, он не учитывает значение аргумента (который в любом случае уже урезан до -489 934 592, так что это тоже не поможет). Поскольку i
является int
, overloadedMethod(i *= i)
всегда вызывает overloadedMethod(int i)
. Никогда другой overloadedMethod
.