Всегда ли статические методы в Java разрешаются во время компиляции? - PullRequest
8 голосов
/ 24 июня 2009

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

Ответы [ 3 ]

8 голосов
/ 24 июня 2009

Да, это подробно исследовано и объяснено в этой теме на форумах Sun: Новое в Java - нет поздней привязки для статических методов

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

Когда компилятор компилирует этот класс, он решает во время компиляции, какой именно метод вызывается для каждого вызова статического метода (в этом и заключается большая разница с вызовами нестатических методов: точный вызываемый метод определяется только во время выполнения в этих случаях ).

Вызов статических методов зависит только от типа времени компиляции, для которого он вызывается.

5 голосов
/ 24 июня 2009

Да, но если статический метод был удален во время выполнения, будет вызван соответствующий метод в базовом классе (имя и подпись должны точно соответствовать исходному методу во время компиляции, а метод должен быть доступен по правилам спецификации 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.

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

class Derived extends Base {
}

Отпечатки Base.

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

class Derived {
}

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

2 голосов
/ 24 июня 2009

краткий ответ: да

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

...