[英]Why int data type is behaving like this in JAVA?
下面是我的代碼及其輸出,但我不明白為什么它會給出這樣的輸出? 任何人都可以幫助我理解輸出。
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
.
.
.
它進入無限循環
您首先調用overloadedMethod(int i)
傳遞一個 300 的參數。這會打印:
int 300
然后i *= i
乘以i
與i
並存儲結果,90 000,返回到i
。 然后您再次使用 this 作為參數調用相同的方法。 這稱為遞歸。 所以該方法的新調用打印:
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
。
你在這里有一個無限循環:
static int overloadedMethod(int i) {
System.out.println("int " + i);
return overloadedMethod(i *= i);
}
return 語句調用它的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.