下面是我的代码及其输出,但是我不明白为什么它给出了这样的输出?任何人都可以帮助我了解输出。
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
.
.
.
进入无限循环
答案 0 :(得分:1)
您首先调用overloadedMethod(int i)
并传递300的参数。这将输出:
int 300
然后,i *= i
与i
乘以i
并将结果90 000存储回i
中。然后,将其作为参数再次调用相同的方法。这称为递归。因此,该方法的新调用将输出:
int 90000
下次您再广场。您可能期望得到8100000000,但是int
无法保存该值。它溢出了。不幸的是,您在Java中没有收到有关此消息。结果是
int -489934592
接下来的几个乘法也会溢出,但是溢出后的结果恰好是0:
int 0
从这一点开始,乘法不再溢出,每次仅产生0。
您永远也不会退出递归。它一直持续到调用堆栈溢出为止。这称为无限递归。
您是否期望Java看到8100000000不是一个int
,然后使用float
或double
参数调用重载方法?如您所见,这不会发生。 Java决定在编译时调用哪个重载方法。因此,它不会考虑该参数的值(无论如何该参数已被截断为-489 934 592,因此也无济于事)。由于i
是int
,因此overloadedMethod(i *= i)
总是调用overloadedMethod(int i)
。从来没有其他overloadedMethod
。
答案 1 :(得分:0)
您在这里有无限循环:
static int overloadedMethod(int i) {
System.out.println("int " + i);
return overloadedMethod(i *= i);
}
调用它的方法的返回语句。