我今天正在追踪一个错误,我发现其中一个类中有一些奇怪的东西。我删除尽可能多的代码在这里发布:
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如何跟踪哪种方法?