Виртуальные функции java
Можете ли вы написать виртуальные функции / методы на Java?
можно писать виртуальный методы в Java, как это было бы в C++?
или, есть ли правильный подход Java, который вы можете реализовать, который производит подобное поведение? Могу я привести несколько примеров?
6 ответов
с Википедия
на Java, все нестатические методы по по умолчанию «виртуальные функции.» только методы, отмеченные ключевое слово final, который нельзя отменить, вместе с частные методы, которые не в наследство, являются non-virtual.
можете ли вы писать виртуальные функции на Java?
да. Фактически, все методы экземпляра в Java являются виртуальными по умолчанию. Только некоторые методы не являются виртуальными:
- методы класса (потому что обычно каждый экземпляр содержит информацию, такую как указатель на vtable о его конкретных методах, но экземпляр здесь недоступен).
- методы частного экземпляра (поскольку ни один другой класс не может получить доступ к методу, вызывающий экземпляр всегда имеет тип определение самого класса и поэтому однозначно известно во время компиляции).
вот несколько примеров:
«нормальные» виртуальные функции
следующий пример из старая версия страницы Википедии, упомянутой в другом ответе.
пример с интерфейсами
Java методы интерфейса все виртуальный. Они!—33—>должны быть виртуальными, потому что они полагаются на классы реализации для предоставления реализаций метода. Код для выполнения будет выбран только во время выполнения.
пример с виртуальными функциями с абстрактными классами.
похож на интерфейсы абстрактные классы должны содержать виртуальные методы, потому что они полагаются на расширение классов реализация. Например:
все функции в Java являются виртуальными по умолчанию.
вы должны сделать все возможное, чтобы написать не виртуальные функции, добавив ключевое слово «final».
Это противоположность C++/C# по умолчанию. По умолчанию функции класса не являются виртуальными; вы делаете их так, добавляя модификатор «virtual».
все non-private методы экземпляра являются виртуальными по умолчанию в Java.
В C++, частные методы могут быть виртуальными. Это можно использовать для идиомы non-virtual-interface (NVI). В Java вам нужно будет защитить переопределяемые методы NVI.
из спецификации языка Java, v3:
8.4.8.1 переопределение (методами экземпляра) метода экземпляра m1 объявленные в классе C может другой метод экземпляра, м2, объявленный в классе A iff все следующие верны:
- C является подклассом А.
- подпись M1 подподписью (§8.4.2) подписи м2.
- либо * m2 является общедоступным, защищенным или объявленным с доступом по умолчанию в пакет C или * m1 переопределяет метод m3, M3, отличный от M1, m3, отличный от m2, таким образом, что m3 переопределяет m2.
Да, вы можете писать виртуальные «функции» на Java.