Binding Statis dan Dinamis di Java

1. Perkenalan

Polimorfisme memungkinkan objek mengambil berbagai bentuk - ketika sebuah metode menunjukkan polimorfisme, kompilator harus memetakan nama metode ke implementasi akhir.

Jika dipetakan pada waktu kompilasi, itu mengikat statis atau awal.

Jika diselesaikan pada waktu proses, ini dikenal sebagai dynamic atau late binding.

2. Memahami Melalui Kode

Ketika sebuah subclass memperluas superclass, ia dapat mengimplementasikan kembali metode yang ditentukan olehnya. Ini disebut metode penggantian.

Sebagai contoh, mari kita membuat hewan kelas super :

public class Animal { static Logger logger = LoggerFactory.getLogger(Animal.class); public void makeNoise() { logger.info("generic animal noise"); } public void makeNoise(Integer repetitions) { while(repetitions != 0) { logger.info("generic animal noise countdown " + repetitions); repetitions -= 1; } } }

Dan anjing subclass :

public class Dog extends Animal { static Logger logger = LoggerFactory.getLogger(Dog.class); @Override public void makeNoise() { logger.info("woof woof!"); } }

Pada overloading metode, seperti makeNoise () dari Animal kelas, compiler akan menyelesaikan metode dan kode pada waktu kompilasi. Ini adalah contoh pengikatan statis.

Namun, jika kita menetapkan objek bertipe Dog ke referensi bertipe Animal , kompilator akan menyelesaikan pemetaan kode fungsi saat runtime. Ini adalah pengikatan dinamis.

Untuk memahami cara kerjanya, mari tulis cuplikan kode kecil untuk memanggil kelas dan metodenya:

Animal animal = new Animal(); // calling methods of animal object animal.makeNoise(); animal.makeNoise(3); // assigning a dog object to reference of type Animal Animal dogAnimal = new Dog(); dogAnimal.makeNoise(); The output of the above code will be:
com.baeldung.binding.Animal - generic animal noise com.baeldung.binding.Animal - generic animal noise countdown 3 com.baeldung.binding.Animal - generic animal noise countdown 2 com.baeldung.binding.Animal - generic animal noise countdown 1 com.baeldung.binding.Dog - woof woof!

Sekarang, mari buat kelas:

class AnimalActivity { public static void eat(Animal animal) { System.out.println("Animal is eating"); } public static void eat(Dog dog) { System.out.println("Dog is eating"); } }

Mari kita tambahkan baris ini ke kelas utama:

AnimalActivity.eat(dogAnimal);

Outputnya adalah:

com.baeldung.binding.AnimalActivity - Animal is eating

Contoh ini menunjukkan bahwa fungsi statis mengalami pengikatan statis .

Alasannya adalah subclass tidak dapat mengganti metode statis. Jika subclass menerapkan metode yang sama, itu akan menyembunyikan metode superclass. Demikian pula, jika metode bersifat final atau privat, JVM akan melakukan pengikatan statis.

Metode terikat statis tidak terkait dengan objek tertentu melainkan disebut pada Type (kelas di Java). Eksekusi metode seperti itu sedikit lebih cepat.

Metode lain secara otomatis menjadi metode virtual di Java. JVM menyelesaikan metode tersebut saat runtime dan ini mengikat dinamis.

Implementasi yang tepat bergantung pada JVM, tetapi itu akan mengambil pendekatan seperti C ++, di mana JVM mencari tabel virtual untuk memutuskan objek mana yang akan dipanggil metode tersebut.

3. Kesimpulan

Binding adalah bagian integral dari bahasa yang mengimplementasikan polimorfisme, penting untuk memahami implikasi dari pengikatan statis dan dinamis untuk memastikan bahwa aplikasi kita berperilaku seperti yang kita inginkan.

Dengan pemahaman itu, bagaimanapun, kami dapat menggunakan pewarisan kelas secara efektif serta metode overloading.

Seperti biasa, kode tersedia di GitHub.