Сегодня я отслеживал ошибку, и я заметил что-то странное в одном из наших классов. Я вырезал как можно больше кода, чтобы опубликовать здесь:
class A {
static int obtainNumber() { return 42; }
static int obtainNumber() { return 3; }
static int obtainNumber() { return -1; }
static {
System.out.println(obtainNumber());
}
}
Этот класс имеет 3 метода с одинаковым именем и сигнатурой. Сначала я думал, что это неверный код, но затем затмение выделило бы код красным. Он работает:
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, какой метод является?