为什么在JAVA中int数据类型的行为如此?

时间:2019-01-16 10:01:37

标签: java types core

下面是我的代码及其输出,但是我不明白为什么它给出了这样的输出?任何人都可以帮助我了解输出。

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 :(得分:1)

您首先调用overloadedMethod(int i)并传递300的参数。这将输出:

int 300

然后,i *= ii乘以i并将结果90 000存储回i中。然后,将其作为参数再次调用相同的方法。这称为递归。因此,该方法的新调用将输出:

int 90000

下次您再广场。您可能期望得到8100000000,但是int无法保存该值。它溢出了。不幸的是,您在Java中没有收到有关此消息。结果是

int -489934592

接下来的几个乘法也会溢出,但是溢出后的结果恰好是0:

int 0

从这一点开始,乘法不再溢出,每次仅产生0。

您永远也不会退出递归。它一直持续到调用堆栈溢出为止。这称为无限递归。

您是否期望Java看到8100000000不是一个int,然后使用floatdouble参数调用重载方法?如您所见,这不会发生。 Java决定在编译时调用哪个重载方法。因此,它不会考虑该参数的值(无论如何该参数已被截断为-489 934 592,因此也无济于事)。由于iint,因此overloadedMethod(i *= i)总是调用overloadedMethod(int i)。从来没有其他overloadedMethod

答案 1 :(得分:0)

您在这里有无限循环:

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

调用它的方法的返回语句。