[英]How does Java distinguish these multiple methods with the same name/signature?
我今天正在追蹤一個錯誤,我發現其中一個類中有一些奇怪的東西。 我刪除盡可能多的代碼在這里發布:
class A {
static int obtainNumber() { return 42; }
static int obtainNumber() { return 3; }
static int obtainNumber() { return -1; }
static {
System.out.println(obtainNumber());
}
}
這個類有3個方法,名稱和簽名完全相同。 起初我以為這是無效代碼,但是eclipse會突出顯示紅色代碼。 它確實有效:
javac A.java && java A
42
Exception in thread "main" java.lang.NoSuchMethodError: main
所以我想也許Java會使用它看到的第一個。 我重新測試了:
class A {
static int obtainNumber() { return 3; }
static int obtainNumber() { return -1; }
static int obtainNumber() { return 42; }
static {
System.out.println(obtainNumber());
}
}
不,同樣的結果:
javac A.java && java A
42
Exception in thread "main" java.lang.NoSuchMethodError: main
我想也許它使用的是42,因為它是最大的。 為了測試這個,我拿了原始並更改了返回值:
class A {
static int obtainNumber() { return 0; }
static int obtainNumber() { return 1; }
static int obtainNumber() { return 2; }
static {
System.out.println(obtainNumber());
}
}
它仍然知道使用第一個:
javac A.java && java A
0
Exception in thread "main" java.lang.NoSuchMethodError: main
如果我再次對它們重新排序:
class A {
static int obtainNumber() { return 1; }
static int obtainNumber() { return 0; }
static int obtainNumber() { return 2; }
static {
System.out.println(obtainNumber());
}
}
相同的結果:
javac A.java && java A
0
Exception in thread "main" java.lang.NoSuchMethodError: main
我認為Java是一種基於文本的語言,我希望這種語言不可能。 Java如何跟蹤哪種方法?
我剛剛在我的IDE中復制/粘貼了這個,雖然這是一個奇跡,然后在嘗試保存文件時出現錯誤消息,清除此問題 :
保存無法完成。 如果問題仍然存在,請嘗試文件>另存為...
原因:使用“Cp1252”caracter編碼無法映射某些字符。 更改編碼或刪除“Cp1252”caracter編碼不支持的字符。
因此,這些方法名稱不同,只使用看起來相同的字符。
有關Java源文件的字符編碼的更多信息:
隱藏的字符。 源代碼相當於
static int obtainNumber() { return 42; }
static int obtain \ Number() { return 3; }
static int obtain \\ Number() { return -1; }
為了避免這種問題,我的源文件嚴格來說是US-ASCII。 我想確定我看到的字符正是編譯器看到的字符。
我原來的評論:
如果你注意到,那個被采用的是具有不同語法的語法。 也許這可能會基於隱藏的角色或語法怪癖來提醒你。
我將它粘貼到Eclipse中,並注意到了一些額外的角色。 我將保存的文件(在CP1252中)扔到十六進制編輯器中,找到一個字節順序標記。
當我看,CP1252沒有字節順序標記,但字符本身在CP1252中。 可能已進入迷路unicode角色。
當我仔細觀察時,另一種方法在另一個字節順序中有另一個字節順序標記。
他們是如何成為的,我們永遠不會知道。 但是,我們知道編譯器正在使用沒有字節順序標記的編譯器。
您應該檢查項目是否存在編碼問題,特別是如果它已從其他系統類型或可能有故障或已暴露給傳統設備的舊存儲介質中恢復。
我們現在真正需要處理通過元這
一段時間
的行為FGITW。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.