我今天正在追踪一个错误,我注意到我们的一个类(class)中有一些奇怪的东西。我删掉了尽可能多的代码以张贴在这里:
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 中复制/粘贴了这个,虽然这是一个奇迹,但当尝试保存文件时出现了一条错误消息,清除了这个问题:
Save could not be complete. Try File > Save As... if the problem persists.
Reason: Some characters cannot be mapped using "Cp1252" caracter encoding. Either change the encoding or remove the characters which are not supported by the "Cp1252" caracter encoding.
因此,这些方法没有相同的名称,只是使用看起来相同的字符。
有关 Java 源文件字符编码的更多信息:
关于java - Java如何区分这些具有相同名称/签名的多个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17662815/