Подтвердить что ты не робот

Почему invokeSpecial необходим, когда invokeVirtual существует

Для вызова методов Java существует три кода операций. Понятно, что invokeStatic предназначен только для вызова статического метода.

Насколько я знаю, invokespecial используется при вызове конструктора и частных методов. Так Нужно ли нам различать вызов частного и общедоступного метода во время выполнения? Он может быть вызван с тем же кодом операции, который называется invokevirtual? Поддерживает ли JVM определение частных и общедоступных методов? Насколько я знаю, государственные и частные ключевые слова просто необходимы на этапе разработки для инкапсуляции?

Любые комментарии, спасибо.

4b9b3361

Ответ 1

http://www.artima.com/underthehood/invocationP.html Ссылка, приведенная выше, дает четкие примеры, которые дополняют мой вопрос.

class Superclass {

    private void interestingMethod() {
        System.out.println("Superclass interesting method.");
    }

    void exampleMethod() {
        interestingMethod();
    }
}

class Subclass extends Superclass {

    void interestingMethod() {
        System.out.println("Subclass interesting method.");
    }

    public static void main(String args[]) {
        Subclass me = new Subclass();
        me.exampleMethod();
    }
}

При вызове main() в подклассе, как определено выше, он должен напечатать "Суперклассный интересный метод". Если invokevirtual был использован, он бы напечатал "Подкласс интересный метод". Зачем? Поскольку виртуальная машина выбирает метод interestingMethod() для вызова на основе фактического класса объекта, который является подклассом. Поэтому он будет использовать Subclass interestingMethod(). С другой стороны, с помощью invokespecial виртуальная машина выберет метод, основанный на типе ссылки, поэтому будет запущена версия суперкомплекса interestingMethod().

Ответ 2

От этот сайт

Ответ можно легко найти, если внимательно прочитать Java VM Spec:

Разница между invokespecial и invokevirtual инструкциями заключается в том, что invokevirtual вызывает метод, основанный на классе объекта. Функция invokespecial используется для вызова методов инициализации экземпляра, а также частных методов и методов суперкласса текущего класса.

Другими словами, invokespecial используется для вызова методов без учета динамического связывания, чтобы вызвать конкретную версию класса метода.