Почему тип данных int ведет себя так в JAVA? - PullRequest
0 голосов
/ 16 января 2019

Ниже мой код и его вывод, но я не мог понять, почему он дает такой вывод? Любой, помогите мне понять вывод.

public class MainClass1 {
   double overloadedMethod(double d) {
          System.out.println("double " + d);
          return overloadedMethod(d *= d);
   }

   static int overloadedMethod(int i) {
          System.out.println("int " + i);
          return overloadedMethod(i *= i);
   }

   float overloadedMethod(float f) {
          System.out.println("float " + f);
          return overloadedMethod(f *= f);
   }

   public static void main(String[] args) {
          MainClass1 mc = new MainClass1();
          int jj = 300;
          System.out.println(mc.overloadedMethod(jj));
   }

}

Выход: -

int 300
int 90000
int -489934592
int 560005120
int 0
int 0
int 0
int 0
.
.
.

И это входит в бесконечный цикл

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы сначала вызываете 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.

0 голосов
/ 16 января 2019

у вас есть бесконечный цикл здесь:

    static int overloadedMethod(int i) {
      System.out.println("int " + i);
      return overloadedMethod(i *= i);
    }

оператор возврата, вызывающий его метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...