можете ли вы написать виртуальные функции/методы в java?

<p>можно ли написать<em> виртуальные </em>методы в java, как это можно было бы сделать в c++?</p><p>или есть ли подходящий подход java, который вы можете реализовать, который производит подобное поведение? могу я привести несколько примеров?</p>

<h2>из <a href="http://en.wikipedia.org/wiki/virtual\_function">википедия</a> </h2><blockquote> <p>в <strong>java</strong> все нестатические методы являются по умолчанию "<strong>virtual functions.</strong>" only методы, помеченные <strong>ключевым словом final</strong>, который нельзя переопределить вместе с <strong>private методы</strong>, которые не являются наследуются, являются <strong>не виртуальными</strong>.</p> </blockquote>

<h2>можете ли вы написать виртуальные функции на java?</h2><p>да. фактически, все методы экземпляра в java являются виртуальными по умолчанию. только определенные методы не являются виртуальными:</p><ul> <li>методы класса (потому что, как правило, каждый экземпляр хранит информацию, такую как указатель на виртуальную таблицу, о своих конкретных методах, но здесь не доступен ни один экземпляр).</li> <li>закрытые методы экземпляра (поскольку никакой другой класс не может получить доступ к методу, вызывающий экземпляр всегда имеет тип самого определяющего класса и поэтому однозначно известен во время компиляции).</li> </ul><p>вот некоторые примеры:</p><p><strong>"нормальные" виртуальные функции</strong></p><p>следующий пример взят из <a href="https://en.wikipedia.org/w/index.php?title=virtual\_function&oldid=481644937">старой версии</a> страницы википедии, упомянутой в другом ответе.</p><pre><code>import java.util.*; public class animal { public void eat() { system.out.println("i eat like a generic animal."); } public static void main(string[] args) { list<animal> animals = new linkedlist<animal>(); animals.add(new animal()); animals.add(new fish()); animals.add(new goldfish()); animals.add(new otheranimal()); for (animal currentanimal : animals) { currentanimal.eat(); } } } class fish extends animal { @override public void eat() { system.out.println("i eat like a fish!"); } } class goldfish extends fish { @override public void eat() { system.out.println("i eat like a goldfish!"); } } class otheranimal extends animal {} </code></pre><p>результат:</p><pre> я ем как универсальное животное . я ем как рыба! я ем как золотая рыбка! я ем как универсальное животное . </pre><p><strong>пример с интерфейсами</strong> </p><p>java <a href="http://docs.oracle.com/javase/tutorial/java/concepts/interface.html">методы интерфейса</a> все виртуальные. они <em>должны</em> быть виртуальными, потому что они полагаются на реализующие классы, чтобы обеспечить реализации метода. код для выполнения будет выбран только во время выполнения.</p><p>например:</p><pre><code>interface bicycle { //the function applybrakes() is virtual because void applybrakes(); //functions in interfaces are designed to be } //overridden. class acmebicycle implements bicycle { public void applybrakes(){ //here we implement applybrakes() system.out.println("brakes applied"); //function } } </code></pre><p><strong>пример с виртуальными функциями с абстрактными классами.</strong> </p><p>подобно интерфейсам <a href="http://docs.oracle.com/javase/tutorial/java/iandi/abstract.html">абстрактные классы</a> <em>must</em> содержат виртуальные методы, потому что они полагаются на реализацию расширяющихся классов. например:</p><pre><code>abstract class dog { final void bark() { //bark() is not virtual because it is system.out.println("woof"); //final and if you tried to override it } //you would get a compile time error. abstract void jump(); //jump() is a "pure" virtual function } class mydog extends dog{ void jump(){ system.out.println("boing"); //here jump() is being overridden } } public class runner { public static void main(string[] args) { dog dog = new mydog(); // create a mydog and assign to plain dog variable dog.jump(); // calling the virtual function. // mydog.jump() will be executed // although the variable is just a plain dog. } } </code></pre>

<p>все функции в java являются виртуальными по умолчанию.</p><p>вы должны изо всех сил писать не виртуальные функции, добавив ключевое слово «final».</p><p>это противоположность c++/c # по умолчанию. функции класса не являются виртуальными по умолчанию; вы делаете их так, добавляя «виртуальный» модификатор.</p>

<p>все<em> не частные </em>методы экземпляра по умолчанию являются виртуальными в java. </p><p>в c++ частные методы могут быть виртуальными. это можно использовать для идиомы не-виртуального интерфейса (nvi). в java вам нужно сделать защищенные переопределяемые методы nvi.</p><p>из спецификации языка java, версия 3:</p><blockquote> <p>8.4.8.1 переопределение (методами экземпляра) метод экземпляра m1 объявлено в переопределении класса c другой метод экземпляра, m2, объявлен в классе а, если все следующие верны</p> <ol> <li>c является подклассом a.</li> <li>подпись m1 является подписью (§8.4.2) подписи м2.</li> <li>или * m2 является общедоступным, защищенным или объявленным с доступом по умолчанию в тот же пакет, что и c, или * m1 переопределяет метод m3, m3 отличается от m1, m3 отличается от м2, так что м3 перекрывает м2.</li> </ol> </blockquote>

<p>да, вы можете писать виртуальные «функции» в java.</p>

<p>в java все общедоступные (не частные) переменные и функции по умолчанию являются<strong> виртуальными </strong>. более того, переменные и функции, использующие ключевое слово<strong> final </strong>не являются<strong> virtual </strong>.</p>