2010-03-21 4 views

ответ

12

Да, виртуальные методы обрабатываются по-разному с помощью компилятора и среды выполнения. JVM, в частности, использует virtual method table для виртуального Способ доставки:

отправка таблица объекта будет содержать адреса динамически связанных методов объекта. Метод вызовы выполняются путем извлечения адреса метода из таблицы отправки объекта. Таблица рассылки такая же для всех объектов, принадлежащих того же класса, и поэтому обычно используется между ними. Объекты , принадлежащая к типу-совместимые классы (например братья в иерархии наследования) будут иметь отправку таблиц с одной и той же компоновкой: в адрес данного метода будет появляться в том же смещении для всех классов типа, совместимого , Таким образом, , получая адрес метода из , учитывая смещение таблицы отправки, получит метод, соответствующий фактическому классу объекта .

35

Все методы в java являются виртуальными по умолчанию. Это означает, что любой метод может быть переопределен при использовании в наследовании, если этот метод не объявлен окончательным или статическим.

+2

Нестатические (экземпляры) методы всегда являются виртуальными. Статические (классные) методы никогда не являются виртуальными. Вы правы в том, что виртуальный метод, объявленный окончательным, не может быть переопределен в производном классе. –

+0

не забывайте конструктор. –

+0

@JerryLiu Это зависит от того, вы считаете конструктор методом или нет. Я считаю, что сообщество по-прежнему не соглашается на эту тему. –

13

«Виртуальный» - термин C++. На Java нет виртуальных методов. Существуют обычные методы, которые являются временными и полиморфными, а также статическими или конечными методами, а это не так.

+0

Некоторая ошибка здесь? Скажи. – EJP

+12

Я не уменьшал, но я думаю, что утверждение «все методы в Java виртуальны по умолчанию» лучше. Хотя в Java нет конкретного «виртуального» модификатора, базовая концепция остается прежней. Утверждение, что нет виртуальных методов, немного вводит в заблуждение. IMHO – ChrisWue

+2

@ChrisWue Но ваша версия неверна. Статические методы не являются виртуальными ни в каком смысле, ни во время выполнения - полиморфными. Моя версия фиксирует это: у вас нет. И бритва Оккама диктует, что вы не размножаете понятия бесполезно. Нет необходимости в слове «virtual» при обсуждении Java, больше, чем в самом языке. – EJP

Смежные вопросы