簡體   English   中英

為什么 int 數據類型在 JAVA 中表現得像這樣?

[英]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乘以ii並存儲結果,90 000,返回到i 然后您再次使用 this 作為參數調用相同的方法。 這稱為遞歸。 所以該方法的新調用打印:

int 90000

下次你再來平方。 您可能期望結果為 8 100 000 000,但int不能保存此值。 它溢出。 不幸的是,您在 Java 中沒有收到關於此的消息。 結果是

int -489934592

接下來的幾個乘法也會溢出,但溢出后的結果恰好是 0:

int 0

從這一點開始,乘法不再溢出,每次只產生 0。

你永遠不會擺脫遞歸。 它會一直持續到您的調用堆棧溢出。 這被稱為無限遞歸。

您是否期望 Java 會看到 8 100 000 000 不是一個int ,然后使用floatdouble參數調用重載方法? 如您所見,這不會發生。 Java 決定在編譯時調用哪個重載方法。 所以它沒有考慮參數的值(無論如何它已經被截斷為 -489 934 592,所以它也無濟於事)。 由於iint ,因此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM