Pengikatan Statik dan Dinamik di Jawa

1. Pengenalan

Polimorfisme membolehkan objek mengambil pelbagai bentuk - apabila kaedah menunjukkan polimorfisme, penyusun harus memetakan nama kaedah hingga pelaksanaan akhir.

Sekiranya dipetakan pada waktu kompilasi, ini adalah pengikatan statik atau awal.

Sekiranya ia diselesaikan pada waktu berjalan, ia dikenali sebagai pengikatan dinamik atau lewat.

2. Memahami Melalui Kod

Apabila subkelas memperluas superclass, ia dapat melaksanakan semula kaedah yang ditentukan olehnya. Ini dipanggil kaedah mengatasi.

Sebagai contoh, mari buat Animal superclass :

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 subkelas :

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

Apabila memuatkan kaedah yang berlebihan, seperti makeNoise () dari kelas Animal , penyusun akan menyelesaikan kaedah dan kodnya pada waktu kompilasi. Ini adalah contoh pengikatan statik.

Namun, jika kita menetapkan objek jenis Dog ke rujukan jenis Animal , penyusun akan menyelesaikan pemetaan kode fungsi pada waktu runtime. Ini adalah pengikatan dinamik.

Untuk memahami bagaimana ini berfungsi, mari tulis coretan kod kecil untuk memanggil kelas dan kaedahnya:

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);

Hasilnya adalah:

com.baeldung.binding.AnimalActivity - Animal is eating

Contoh ini menunjukkan bahawa fungsi statik mengalami pengikatan statik .

Sebabnya ialah subkelas tidak dapat mengatasi kaedah statik. Sekiranya subkelas menerapkan kaedah yang sama, ia akan menyembunyikan kaedah superclass. Begitu juga, jika kaedah adalah muktamad atau peribadi, JVM akan melakukan pengikatan statik.

Kaedah terikat statik tidak dikaitkan dengan objek tertentu tetapi disebut pada Jenis (kelas di Java). Pelaksanaan kaedah sedemikian sedikit lebih cepat.

Kaedah lain secara automatik adalah kaedah maya di Java secara lalai. JVM menyelesaikan kaedah seperti itu pada waktu berjalan dan ini adalah pengikatan dinamik.

Pelaksanaan yang tepat bergantung pada JVM, tetapi akan memerlukan pendekatan seperti C ++, di mana JVM mencari meja maya untuk menentukan objek mana yang akan dipanggil kaedah tersebut.

3. Kesimpulannya

Mengikat adalah bahagian tidak terpisahkan dari bahasa yang menerapkan polimorfisme, penting untuk memahami implikasi pengikatan statik dan dinamik untuk memastikan bahawa aplikasi kita berkelakuan seperti yang kita mahukan.

Dengan pemahaman itu, kita dapat menggunakan pewarisan kelas dan kaedah yang berlebihan.

Seperti biasa, kodnya tersedia di GitHub.