我今天正在追踪一个错误,我注意到我们的一个班级中有一些奇怪的事情。我剪掉了尽可能多的代码来在这里发布:
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如何跟踪哪个方法是哪个?