Jawaban:
Di Jawa , semua metode non-statis secara default " fungsi virtual. " Hanya metode yang ditandai dengan kata kunci akhir , yang tidak dapat diganti, bersama dengan metode pribadi , yang tidak diwariskan, adalah non-virtual .
Iya. Faktanya, semua metode instance di Java adalah virtual secara default. Hanya metode tertentu yang tidak virtual:
Berikut ini beberapa contohnya:
Fungsi virtual "Normal"
Contoh berikut adalah dari versi lama halaman wikipedia yang disebutkan dalam jawaban lain.
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 {}
Keluaran:
Saya makan seperti Hewan generik. Saya makan seperti ikan! Saya makan seperti ikan mas! Saya makan seperti Hewan generik.
Contoh dengan fungsi virtual dengan antarmuka
Metode antarmuka Java semuanya virtual. Mereka harus virtual karena mereka bergantung pada kelas implementasi untuk menyediakan implementasi metode. Kode yang akan dieksekusi hanya akan dipilih pada saat run time.
Sebagai contoh:
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
}
}
Contoh dengan fungsi virtual dengan kelas abstrak.
Mirip dengan antarmuka Kelas abstrak harus berisi metode virtual karena mereka bergantung pada implementasi perluasan kelas. Sebagai contoh:
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.
}
}
Semua fungsi di Java adalah virtual secara default.
Anda harus keluar dari cara Anda untuk menulis fungsi non-virtual dengan menambahkan kata kunci "final".
Ini kebalikan dari standar C ++ / C #. Fungsi kelas adalah non-virtual secara default; Anda membuatnya dengan menambahkan pengubah "virtual".
Semua metode instance non-pribadi adalah virtual secara default di Jawa.
Dalam C ++, metode pribadi bisa virtual. Ini dapat dieksploitasi untuk idiom non-virtual-interface (NVI). Di Jawa, Anda harus membuat metode NVI yang dapat ditimpa dilindungi.
Dari Spesifikasi Bahasa Jawa, v3:
8.4.8.1 Overriding (dengan Metode Instance) Suatu metode instance m1 yang dideklarasikan dalam kelas C menimpa metode instance lain, m2, dideklarasikan di kelas A jika semua hal berikut ini benar:
- C adalah subkelas dari A.
- Tanda tangan m1 adalah subsignature (§8.4.2) dari tanda tangan m2.
- Entah * m2 bersifat publik, dilindungi atau dideklarasikan dengan akses default dalam paket yang sama dengan C, atau * m1 mengganti metode m3, m3 berbeda dari m1, m3 berbeda dari m2, sehingga m3 menimpa m2.
Di Java, semua variabel & fungsi publik (non-pribadi) adalah Virtual secara default. Selain itu variabel & fungsi yang menggunakan kata kunci akhir tidak virtual .