Вопрос по java – Всегда ли статические методы в Java разрешаются во время компиляции?

8

Всегда ли статические методы в Java разрешаются во время компиляции?

Ваш Ответ

3   ответа
2

yes

Я не смог найти точный разделСпецификация языка Java, Пожалуйста помоги. :)

Еще один короткий ответ: Нет.
пожалуйста, есть ли какой-нибудь хитрый случай, когда правило не применяется?
@Joao: в Java статический модификатор означает ровно «во время компиляции». Метод / переменная статически связаны с именем класса. Без исключений.
@dfa: Мне жаль, если это было неясно; мой короткий ответ был в ответ на @Joao Luis & apos; контрольный вопрос. Ваш короткий ответ был, конечно, правильным, и я не хотел подразумевать иное.
8

Новое в Java - нет поздней привязки для статических методов

Несколько цитат:

When the compiler compiles that class it decides at compile time which exact method is called for each static method call (that's the big difference to non-static method calls: the exact method to be called is only decided at runtime in those cases).

Calling static methods only ever depends on the compile-time type on which it is called.

@ Робин: цитата не моя, но хорошая мысль :)
Правильный ответ на вопрос, но неверная цитата о нестатических методах, решенная только во время выполнения. Только переопределенные методы определяются во время выполнения, другие определяются во время компиляции, включая переопределенные.
5

но если статический метод был удален во время выполнения, будет вызван соответствующий метод в базовом классе (имя и подпись должны точно соответствовать исходному методу во время компиляции, а метод должен быть доступен по правилам спецификации JVM).

Чтобы уточнить, рассмотрим код вызова:

   Derived.fn();

И следующий вызванный код:

class Base {
    public static void fn() {
        System.err.println("Base");
    }
}
class Derived extends Base {
    public static void fn() {
        System.err.println("Derived");
    }
}

ПечатьDerived.

Теперь я все компилирую. Затем перекомпилируйте только что Derived изменилось на:

class Derived extends Base {
}

ПечатьBase.

Возможно, тогда я перекомпилирую только что Derived изменился на:

class Derived {
}

Выдает ошибку.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы